用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:4不能在第三位,3与5不能相连。...
生活随笔
收集整理的這篇文章主要介紹了
用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:4不能在第三位,3与5不能相连。...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在看算法,看到這個題,覺得挺經典的,收起。
?
分析:
? ? ? ??1 、把問題歸結為圖結構的遍歷問題。實際上6個數字就是六個結點,把六個結點連接成無向連通圖,對于每一個結點求這個圖形的遍歷路徑,所有結點的遍歷路徑就是最后對這 ?6個數字的排列組合結果集。
? ? ? ? 2、 3,5不能相連:實際要求這個連通圖的結點3,5之間不能連通, 可在構造圖結構時就滿足改條件,然后再遍歷圖。
? ? ? ? 3、 不能有重復: 考慮到有兩個2,明顯會存在重復結果,可以把結果集放在TreeSet中過濾重復結果
? ? ? ? 4、 ? 4不能在第三位: 仍舊在結果集中去除滿足此條件的結果。
?
package JingDian;import java.util.Iterator; import java.util.TreeSet;public class numberRandom {String[] stra = {"1","2","2","3","4","5"};int n = stra.length;boolean[] visited = new boolean[n];String result = "";TreeSet<String> ts = new TreeSet<String>();int[][] a = new int[n][n];private void searchMap(){for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j){//圖中對角線部分是無法訪問的a[i][j]=0;}else{a[i][j]=1;}} }//3和5不能相連a[3][5]=0;a[5][3]=0;//開始遍歷for(int i=0;i<n;i++){search(i);}Iterator<String> it = ts.iterator();while(it.hasNext()){String str =it.next();//4不能在第三位if(str.indexOf("4")!=2){System.out.println(str);}}}//這是個深度優先的遍歷private void search(int startIndex){visited[startIndex] = true; result = result + stra[startIndex];if(result.length() ==n){ts.add(result);}for(int j=0;j<n;j++){if(a[startIndex][j]==1&&visited[j]==false){search(j);}else{continue;}}//一個result結束后踢掉最后一個,尋找別的可能性,若沒有的話,則繼續向前踢掉當前最后一個result = result.substring(0,result.length()-1);visited[startIndex] = false;}public static void main(String[] args){new numberRandom().searchMap();}}?
轉載于:https://www.cnblogs.com/skylar/p/3671795.html
總結
以上是生活随笔為你收集整理的用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:4不能在第三位,3与5不能相连。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: paip.提升效率---提升绑定层次--
- 下一篇: 昨天的补给