问题描述:针对1、2、2、3、4、5这6个数字,写一个函数,打印出所有不同的排列,例如512234、215432等,要求“4”不能在第三位,“3”与“5”不能相连。
问题分析:打印数组的排列组合方式最简单的方法就是递归,但是本题中:①数字中存在重复数字②明确规定某些位的特性。采用常规的求解方法不能完全适用。
算法思想:(图思想)把6个数字的组合问题变为图的遍历问题。首先,用1、2、2、3、4、5这6个数字作为6个结点,构造一个无向连通图,除了“3”和“5”不连通。其次,分别从这6个结点出发对图做深度优先遍历。最后,为了去掉重复结果集,将遍历结果存入set集合。最后遍历set集合。
package com.haobi; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /* * 如何按要求打印数组的排列情况 */ public class Test1 { //将元素存入数组 private int[] numbers = new int[] {1,2,2,3,4,5}; //获取数组长度 private int n = numbers.length; //标记图中的结点是否被遍历过 private boolean[] visited = new boolean[n]; //图的二维数组表示 private int[][] graph = new int[n][n]; //数字的组合 private String combination = ""; //用Set集合存储数字组合(过滤重复组合) private Set<String> getAllCombinations(){ //构造图 buildGraph(); //用来存放所有组合 Set<String> set = new HashSet<String>(); //分别从不同的结点出发深度遍历图 for(int i=0;i<n;i++) { this.depthFirstSearch(i, 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位置开始进行深度优先搜索遍历 * @param start * @param set */ private void depthFirstSearch(int start, Set<String> set) { //遍历过的结点标记为true visited[start] = true; //数字组合 combination = combination + numbers[start]; //如果组合完毕,组合的长度等于n(也就是数组的长度) if(combination.length() == n) { //根据题目要求,剔除4出现在第三个位置的情况 if(combination.indexOf("4")!=2) { //将符合要求的结果添加进set集合 set.add(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); //一趟标记完之后,将遍历过的路径设还原为false visited[start] = false; } public static void main(String[] args) { Test1 t = new Test1(); Set<String> set = t.getAllCombinations(); Iterator<String> it = set.iterator(); while(it.hasNext()) { String str = (String)it.next(); System.out.println(str); } } }程序输出结果如下:
322145 512234 225134 231245 415223 325421 512342 322154 243125 542312 541223 232451 123452 523142 251423 422315 243251 542321 541232 152342 415232 325412 345122 243215 513224 412523 221345 522143 122345 342521 152234 451322 215234 512243 432125 132524 541322 312452 225143 523241 123425 523124 142325 231254 432251 152243 342512 321254 345221 132254 431225 513242 215243 245213 521423 312542 521432 542132 543221 321245 242513 345212 125432 123254 425231 223415 312425 252314 123245 125423 251342 252431 422513 152423 245231 542123 543212 341522 413252 432215 145232 425123 251432 145223 223451 542231 152432 431252 212543 241523 322451 542213 232154 315242 425132 421325 312524 251324 252413 142523 152324 232145 243152 322541 321452 432512 132452 342152 522314 125243 423125 252341 523412 143225 521234 325142 322415 231524 242315 452231 125234 423251 315224 523421 521243 213425 342251 521324 522413 143252 251234 225431 245123 342125 543122 325241 413225 322514 231542 321425 212345 325124 231425 232514 321542 132245 213452 241325 452132 432521 425213 225413 423152 421523 521342 522431 251243 245132 452123 512432 252143 523214 223154 321524 452312 451223 232415 132542 132425 341252 512423 315422 223145 522134 432152 342215 325214 215423 431522 213245 513422 412325 221543 312245 522341 423215 122543 452213 215432 213254 512324 312254 252134 231452 232541 451232 341225 452321