第七届蓝桥杯省赛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;
    }
}

 

posted @ 2019-03-22 12:09  k_kK  阅读(273)  评论(0编辑  收藏  举报