zoukankan      html  css  js  c++  java
  • 第七届蓝桥杯省赛javaB组 第七题剪邮票


    剪邮票

    如【图1.jpg】, 有12张连在一起的12生肖的邮票。
    现在你要从中剪下5张来,要求必须是连着的。
    (仅仅连接一个角不算相连)
    比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。

    请你计算,一共有多少种不同的剪取方法。

    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

    -------------------------------------------------------------------------------------------------

    思路:1.五重循环求出找出所有可能的邮票减法,注意去掉剪的邮票相同但剪的次序不同的情况。2.dfs每种剪法。利用{+4,-4,+1,-1}的位置关系来判断每张邮票是否是上下左右相邻的,此时要注意4+1=5的情况。

    public class Main {
        
        static int way[] = {-4,-1,1,4};
        static int sum = 0;
        public static void main(String args[]){
            int flag[] = new int[13];
            for(int a = 1;a<=12;a++){
                for(int b = a+1;b<=12;b++){
                    for(int c = b+1;c<=12;c++){
                        for(int d = c+1;d<=12;d++){
                            for(int e = d+1;e<=12;e++){
                                if(a!=b&&a!=c&&a!=d&&a!=e&&
                                        b!=c&&b!=d&&b!=e&&
                                        c!=d&&c!=e&&
                                        d!=e){
    //                                得到所有可能的剪法
                                    int arrays[] = {a,b,c,d,e};
                                    flag[a] = 1;
                                    flag = new int[13];
                                    qiu(arrays[0],flag,arrays);
                                    int l;
                                    for(l = 0;l<=4;l++){
                                        if(flag[arrays[l]]==0){
                                            break;
                                        }
                                    }
                                    if(l==5){
                                        sum++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
            System.out.println(sum);
        }
    //    dfs
        public static void qiu(int goal,int flag[],int arrays[]){
            int i;
            int res = 0;
            for(i = 0;i<4;i++){
                res = goal+way[i];
                int mark = com(arrays,res);
                if(mark == 1 && flag[res] == 0){
                    if(res == 5&&goal==4) {
                        continue;
                    }
                    if(res == 9&&goal==8) {
                        continue;
                    }
                    if(res == 4&&goal==5) {
                        continue;
                    }
                    if(res == 8&&goal==9) {
                        continue;
                    }
    
                    flag[res] = 1;
                    qiu(res,flag,arrays);
                }
            }
            
        }
        
        public static int com(int arrays[],int temp){
            for(int i = 0;i<arrays.length;i++){
                if(arrays[i] == temp){
                    return 1;
                }
            }
            return -1;
        }
    }
  • 相关阅读:
    linux 下共享内存
    linux shmget shmctl
    linux 进程优先级 之设置实时进程 (另一种方式是设置nice值)
    linux .so .a .o 文件
    linux 时间模块 三
    linux 时间模块 二
    linux 时间模块 一
    设计模式之原型模式(php实现)
    设计模式之建造者模式(php实现)
    设计模式之单例模式(php实现)
  • 原文地址:https://www.cnblogs.com/fightKun/p/10577434.html
Copyright © 2011-2022 走看看