zoukankan      html  css  js  c++  java
  • 方格填数-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]+"	");
     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中的所有数字,每个必须出现且仅出现一次!

     
  • 相关阅读:
    谷歌翻译python接口
    SRILM的安装方法
    语言模型srilm基本用法
    SRILM语言模型格式解读
    矩阵理解
    python生成器 协程
    python Queue模块使用
    scrapy 学习笔记2
    scrapy 学习笔记1
    xpath语法规则
  • 原文地址:https://www.cnblogs.com/jinyufanfan/p/10133837.html
Copyright © 2011-2022 走看看