public class ArrayRank {
private int[] numbers = new int[]{1, 2, 3,4};
private int n = numbers.length;
//用来标记图中结点是否被遍历过
private boolean[] visited = new boolean[n];
//图的二维数组表示
private int[][] graph = new int[n][n];
//数字的组合
private String combination = "";
public Set<String> getAllCombinations() {
//构造图
buildGraph();
//用来存放所有组合
Set<String> set = new HashSet<String>();
//分别从不同的结点出发深度遍历图
for (int i = 0; i < n; i++) {
this.depthFirstSearch(i, set);
}
// this.depthFirstSearch(0, set);
return set;
}
private void buildGraph() {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
graph[i][j] = 0;
} else {
graph[i][j] = 1;
}
}
}
//确保在遍历时3与5是不可达的
// graph[3][5] = 0;
// graph[5][3] = 0;
}
//对树从结点start位置开始进行深度遍历
private void depthFirstSearch(int start, Set<String> set) {
visited[start] = true;
combination = combination + numbers[start];
if (combination.length() == n) {
//4不出现在第三个位置
// if (combination.indexOf("4") != 2) {
// set.add(combination);
System.out.println(combination);
// }
}
for (int j = 0; j < n; j++) {
if (graph[start][j] == 1 && visited[j] == false) {
depthFirstSearch(j, set);
}
}
combination = combination.substring(0, combination.length()-1);
visited[start] = false;
}
public static void main(String[] args) {
ArrayRank t = new ArrayRank();
Set<String> set = t.getAllCombinations();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String string = (String) it.next();
System.out.println(string);
}
}
}
数字全排列
最新推荐文章于 2021-03-23 18:09:30 发布