方格填数-2015决赛C语言A组第一题

 在2行5列的格子中填入1到10的数字。 要求: 相邻的格子中的数,右边的大于左边的,下边的大于上边的。

如【图1.png】所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。(答案: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 }
View Code

 

这道题使用了全排列来解题!关于全排列,我使用如下的方式来总结:

  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]+"\t");
 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 }
View Code

 

搞懂了全排列,这道题就很简单了,下边的题目也是类似的:

看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆
如果每个五角星代表 1 ~ 9 的不同的数字。
这个算式有多少种可能的正确填写方法?
    295 + 173 = 468
    173 + 295 = 468
    183 + 492 = 675
以上都是正确的填写法!
    注意:
    111 + 222 = 333 是错误的填写法!
    因为每个数字必须是不同的! 
    也就是说:1~9中的所有数字,每个必须出现且仅出现一次!

 

 

 

 

posted @ 2018-12-17 20:52  金鱼饭饭  阅读(334)  评论(1编辑  收藏  举报