在2行5列的格子中填入1到10的数字。 要求: 相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如【图1.png】所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。(答案:42)
请你计算一共有多少种可能的方案。
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。(答案:42)
1 public class Main{ 2 3 static int sum = 0; 4 5 public static void main(String[] args){ 6 int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 7 sort(num, 1); 8 System.out.println(sum); 9 } 10 11 // 全排列10个数字 12 public static void sort(int[] str, int start){ 13 for(int i = start; i < str.length-1; i++){ 14 if(i>start){ 15 jiaohuan(str, start, i); 16 } 17 if(start == str.length-2){ 18 // 输出初始状态 19 bianli(str); // abc 20 // 交换后两位,并输出 21 jiaohuan(str, str.length-1, str.length-2); 22 bianli(str); // acb 23 // 复位第16行 24 jiaohuan(str, str.length-1, str.length-2);//恢复到abc 25 return; 26 }else{ 27 sort(str, start+1); 28 } 29 if(i>start){ 30 jiaohuan(str, start, i); 31 } 32 } 33 } 34 35 public static void bianli(int[] arr){ 36 if(arr[0]<arr[1] && arr[1]<arr[2] && arr[2]<arr[3] && arr[3]<arr[4] 37 && arr[5]<arr[6] && arr[6]<arr[7] && arr[7]<arr[8] && arr[8]<arr[9] 38 && arr[0]<arr[5]&& arr[1]<arr[6] && arr[2]<arr[7] && arr[3]<arr[8] && arr[4]<arr[9]){ 39 sum++; 40 } 41 } 42 43 public static void jiaohuan(int[] arr, int a, int b){ 44 int temp = arr[a]; 45 arr[a] = arr[b]; 46 arr[b] = temp; 47 } 48 }
这道题使用了全排列来解题!关于全排列,我使用如下的方式来总结:
1 public class Demo01{ 2 3 static int num = 0; 4 5 public static void main(String[] args){ 6 String[] str = {"a", "b", "c"}; 7 // PaiLie(str); 8 // PaiLie000000(str, 0); 9 10 String[] str1 = {"a", "b", "c", "d"}; 11 // PaiLie11(str1, 0); 12 // PaiLie000000(str1, 0); 13 14 String[] str2 = {"a", "b", "c", "d", "e"}; 15 // PaiLie22(str2); 16 PaiLie000000(str2, 0); 17 18 } 19 20 //a b 21 public static void PaiLie00(String[] arr,int start){ 22 for(int i= start; i<arr.length; i++){ 23 if(i>start){ 24 JiaoHuan(arr, start, i); 25 } 26 // ÏÔʾbac 27 BianLi(arr); 28 if(i>start){ 29 JiaoHuan(arr, start, i); 30 } 31 } 32 } 33 34 // a b c 35 public static void PaiLie(String[] arr, int start){ 36 for(int i= start; i<arr.length; i++){ 37 if(i>start){ 38 JiaoHuan(arr, start, i); 39 } 40 PaiLie00(arr, start+1); 41 if(i>start){ 42 JiaoHuan(arr, start, i); 43 } 44 } 45 } 46 47 // a b c d 48 public static void PaiLie11(String[] arr, int start){ 49 for(int i= start; i<arr.length; i++){ 50 if(i>start){ 51 JiaoHuan(arr, start, i); 52 } 53 PaiLie(arr, start+1); 54 if(i>start){ 55 JiaoHuan(arr, start, i); 56 } 57 } 58 } 59 60 // a b c d e 61 public static void PaiLie22(String[] arr){ 62 for(int i= 0; i<arr.length; i++){ 63 if(i>0){ 64 JiaoHuan(arr, 0, i); 65 } 66 PaiLie11(arr, 1); 67 if(i>0){ 68 JiaoHuan(arr, 0, i); 69 } 70 } 71 } 72 73 public static void PaiLie000000(String[] arr, int start){ 74 for(int i= start; i<arr.length; i++){ 75 if(i>start){ 76 JiaoHuan(arr, start, i); 77 } 78 if(start==arr.length-1){ 79 BianLi(arr); 80 return; 81 } 82 PaiLie000000(arr, start+1); 83 if(i>start){ 84 JiaoHuan(arr, start, i); 85 } 86 } 87 } 88 89 90 91 public static void BianLi(String[] arr){ 92 num++; 93 System.out.print(num+": "); 94 for(int i = 0; i< arr.length; i++){ 95 System.out.print(arr[i]+" "); 96 } 97 System.out.println(); 98 } 99 100 public static void JiaoHuan(String[] arr, int a, int b){ 101 String temp = arr[a]; 102 arr[a] = arr[b]; 103 arr[b] = temp; 104 } 105 }
搞懂了全排列,这道题就很简单了,下边的题目也是类似的:
看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆
如果每个五角星代表 1 ~ 9 的不同的数字。
这个算式有多少种可能的正确填写方法?
295 + 173 = 468
173 + 295 = 468
183 + 492 = 675
以上都是正确的填写法!
注意:
111 + 222 = 333 是错误的填写法!
因为每个数字必须是不同的!
也就是说:1~9中的所有数字,每个必须出现且仅出现一次!