全排列问题
问题描述:针对1、2、2、3、4、5这6个数字,写一个函数,打印出所有不同的排列,例如512234,215432等,要求“4”不能再第三位,“3”,“5”不能相连。
思路:针对这个问题,可以将6个节点构成一个无向连通图。由于3和5不能相连,因此在构造图时3和5不能相连。对于4不能出现在第三位可以在遍历结束时判断。
代码如下:
import java.util.LinkedList; import java.util.Set; import java.util.TreeSet; public class QuanPailie { private int[] numbers = new int[] { 1, 2, 2, 3, 4, 5 }; private int n = numbers.length; private boolean[] visited = new boolean[n]; private int[][] gra = new int[n][n]; private Set<String> set = new TreeSet<String>(); private LinkedList<Integer> stack = new LinkedList<Integer>(); public Set<String> getAll() { buildGra(); for (int i = 0; i < n; i++) { dfs(i, stack); } return set; } private void buildGra() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { gra[i][j] = 0; } else { gra[i][j] = 1; } } } gra[5][3] = 0; gra[3][5] = 0; } private void dfs(int i, LinkedList<Integer> stack) { visited[i]=true; stack.addLast(numbers[i]); if (stack.size() == 6 && stack.get(2) != 4) { set.add(fromStackToString(stack)); } for(int j = 0; j <n; j++) { if(gra[i][j]!=0&&visited[j]==false) dfs(j, stack); } stack.removeLast(); visited[i]=false; } private String fromStackToString(LinkedList<Integer> linkedList) { StringBuilder builder = new StringBuilder(); for (Integer integer : linkedList) { builder.append(integer); } return builder.toString(); } public static void main(String[] args) { QuanPailie pailie=new QuanPailie(); Set<String> set=pailie.getAll(); for (String string : set) { System.out.println(string); } } }
不忘初心,方得始终