• 第七届蓝桥杯javaB组真题解析-剪邮票(第七题)


    题目

    /*
    剪邮票
    
    如【图1.jpg】, 有12张连在一起的12生肖的邮票。
    现在你要从中剪下5张来,要求必须是连着的。
    (仅仅连接一个角不算相连)
    比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。
    
    请你计算,一共有多少种不同的剪取方法。
    
    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
    */

                图1.jpg

                图2.jpg

              图3.jpg

    答案

    116

    代码

     1 public class Main {
     2     static int cc[][] = {
     3             {1,1,0,0,1,0,0,0,0,0,0,0},
     4             {1,1,1,0,0,1,0,0,0,0,0,0},
     5             {0,1,1,1,0,0,1,0,0,0,0,0},
     6             {0,0,1,1,0,0,0,1,0,0,0,0},
     7             {1,0,0,0,1,1,0,0,1,0,0,0},
     8             {0,1,0,0,1,1,1,0,0,1,0,0},
     9             {0,0,1,0,0,1,1,1,0,0,1,0},
    10             {0,0,0,1,0,0,1,1,0,0,0,1},
    11             {0,0,0,0,1,0,0,0,1,1,0,0},
    12             {0,0,0,0,0,1,0,0,1,1,1,0},
    13             {0,0,0,0,0,0,1,0,0,1,1,1},
    14             {0,0,0,0,0,0,0,1,0,0,1,1},
    15     };
    16     public static void main(String[] args) {
    17         int a,b,c,d,e,sum=0;
    18         for(a=0;a<8;a++) {
    19         for(b=a+1;b<9;b++) {
    20         for(c=b+1;c<10;c++) {
    21         for(d=c+1;d<11;d++) {
    22         for(e=d+1;e<12;e++) {
    23             int z[] = {a,b,c,d,e};
    24             if(f(z)){
    25                 System.out.println(a+1+" "+(b+1)+" "+(c+1)+" "+(d+1)+" "+(e+1));
    26                 sum++;
    27             }
    28         }
    29         }
    30         }
    31         }
    32         }
    33         System.out.println(sum);
    34     }
    35     private static boolean f(int[] a) {
    36         int is[] = new int[5];
    37         is[0] = 1;
    38         g(a,0,is);
    39         int zz=0;
    40         for(int i:is){
    41             if(i==1)zz++;
    42         }
    43         if(zz==5) return true;
    44         return false;
    45     }
    46     private static void g(int[] a, int b, int[] c){
    47         for(int i=0;i<c.length;i++){
    48             if(c[i]==0){
    49                 if(cc[a[b]][a[i]]==1){
    50                     c[i] = 1;
    51                     g(a,i,c);
    52                 }
    53             }
    54         }
    55     }
    56 }

    解析

      这道题也是属于排列组合的题,只不过不是前面的全排列,而是从12个数中无前后顺序的抽取5个,然后判断抽出的5个是否满足要求,若是则计数++,否则return ;

      我的解法思路是:用5个for循环嵌套来分别表示这从小到大的5个数,其中的条件也是互相有关联的,用这种方法来抽取5个数并存入数组中,然后用f函数来验证所抽取的是否满足条件,g方法的作用是深度遍历,从数组中第一个数开始按照条件向 足相邻条件的那一项 遍历,并且用is[]数组来做标记,当这一次遍历结束时,判断是否全部遍历,如果是则满足条件return true,否则没有

    return false;

      在判断是否满足相邻关系的那个地方,因为觉得找出逻辑关系很麻烦,所以就自己手动写了一个二位数组,用来判断从1-12,这12个数的两两相邻情况,1则相邻,0则不相邻。

      1是因为懒,2是因为方便,省时间

      可以充分的把一些不是怎么变的东西,用人脑来完成

  • 相关阅读:
    数组与方法
    数据类型
    认识Java(2)
    认识Java(1)
    面试题集锦
    00-python语言介绍
    06-python-生成器、循环器
    00-python-内置函数笔记
    04-python-闭包
    03-python-装饰器
  • 原文地址:https://www.cnblogs.com/loveluking/p/6390455.html
Copyright © 2020-2023  润新知