题目:
标题:图书排列 将编号为1~10的10本书排放在书架上,要求编号相邻的书不能放在相邻的位置。 请计算一共有多少种不同的排列方案。 注意,需要提交的是一个整数,不要填写任何多余的内容。
思路:
方法1. 直接暴力for循环,满足判断条件进行下一层循环。判断条件用set检测重复, 用Math.abs()检测是否相邻
此种方法,比较适合考场头脑紧张发懵的同学吧, 毕竟思路比较简单, 就是步骤比较繁琐。
方法2.用dfs递归 回溯加剪枝,代码量小,要熟悉这个流程
方法1的代码:
package eighth; import java.util.HashSet; import java.util.Set; public class First { static int count = 0; public static void main(String args[]) { int num[] = new int[10]; for (int i = 1; i <= 10; i++) { num[0] = i; for (int j = 1; j <= 10; j++) { num[1] = j; if (check(num, 1)) { for (int k = 1; k <= 10; k++) { num[2] = k; if (check(num, 2)) { for (int l = 1; l <= 10; l++) { num[3] = l; if (check(num, 3)) { for (int m = 1; m <= 10; m++) { num[4] = m; if (check(num, 4)) { for (int n = 1; n <= 10; n++) { num[5] = n; if (check(num, 5)) { for (int o = 1; o <= 10; o++) { num[6] = o; if (check(num, 6)) { for (int p = 1; p <= 10; p++) { num[7] = p; if (check(num, 7)) { for (int q = 1; q <= 10; q++) { num[8] = q; if (check(num, 8)) { for (int x = 1; x <= 10; x++) { num[9] = x; if (check(num, 9)) { count++; } } } } } } } } } } } } } } } } } } } System.out.println(count); } public static boolean check(int array[], int n) { Set set = new HashSet(); for (int i = 0; i <= n; i++) { set.add(array[i]); } if (set.size() == n + 1 && Math.abs(array[n] - array[n - 1]) != 1) return true; else return false; } }
方法2代码:
package eighth; import java.util.HashSet; import java.util.Set; public class First_two { static int num[] = new int[10]; static int count=0; public static void main(String args[]){ for(int i=0;i<10;i++){ num[i]=i+1; } int res[] = new int [10]; dfs(res,0); System.out.println(count); } public static void dfs(int res[], int n){ if(n==10){ count++; } else { for(int i =0;i<10;i++){ res[n] = num[i]; if(check(res,n)){ dfs(res,n+1); } } } } public static boolean check(int res[],int n){ Set set = new HashSet(); for(int i =0;i<=n;i++){ set.add(res[i]); } if(n==0) return true; if(set.size()==n+1&&Math.abs(res[n]-res[n-1])!=1) return true; else return false; } }
运行结果:479306