• 蓝桥杯 第七届 JAVA B组 剪邮票


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

     

    方法一:排列组合 (深度优先)

         1、12个数字中选中5个 

         2、深度遍历5个数字是否相邻

    import java.util.*;
    
    public class Main{
        static int[] num;
        static boolean[] vis;
    
        static boolean judge() {
            vis = new boolean[6];
            dfs(1);
            return vis[1]&&vis[2]&&vis[3]&&vis[4]&&vis[5];
        }
        
        static void dfs(int x) {
            vis[x] = true;
            for(int i=1;i<=5;i++) {
                if(!vis[i]&&(num[i]/4==num[x]/4)&&(num[i]==num[x]-1||num[i]==num[x]+1))//数num[i]没有遍历过,且两个数在同一行且相邻,则遍历该数,将i该数附为true
                    dfs(i);
                if(!vis[i]&&(num[i]%4==num[x]%4)&&(num[i]==num[x]-4||num[i]==num[x]+4))//两个数在同一列且相邻
                    dfs(i);
            }
        }
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            num = new int[15];
            int cnt = 0;
            
            for(num[1]=0;num[1]<12;num[1]++)    //0-11
                for(num[2]=num[1]+1;num[2]<12;num[2]++)
                    for(num[3]=num[2]+1;num[3]<12;num[3]++)
                        for(num[4]=num[3]+1;num[4]<12;num[4]++)
                            for(num[5]=num[4]+1;num[5]<12;num[5]++) {
                                if(judge()) cnt++;
                            }
            System.out.println(cnt);
        }
    }

    方法二  排列组合

        1、个数字中选中5个 

         2、广度优先遍历5个数字是否相邻

    public class JAVA7{
        
        static boolean[] vis;
        
        public static void main(String[] args) {
            
            Scanner scanner = new Scanner(System.in);
            int[] num = {1,2,3,4,6,7,8,9,11,12,13,14};
            
            int cnt = 0;
            
            for(int a=0;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++) {
                                vis = new boolean[15];
                                vis[num[a]] = true;
                                vis[num[b]] = true;
                                vis[num[c]] = true;
                                vis[num[d]] = true;
                                vis[num[e]] = true;
                                
                                Queue<Integer> queue = new LinkedList<>();
                                queue.add(num[a]);
                                vis[num[a]] = false;
                                int num1 =0;
                                
                                while(!queue.isEmpty()) {
                                    int top = queue.poll();
                                    num1++;
                                    if(top+5<15&&top+5>=0&&vis[top+5]) {queue.add(top+5); vis[top+5]=false;}
                                    if(top-5>=0&&top-5<15&&vis[top-5]) {queue.add(top-5); vis[top-5]=false;}
                                    if(top+1<15&&top+1>=0&&vis[top+1]) {queue.add(top+1); vis[top+1]=false;}
                                    if(top-1>=0&&top-1<15&&vis[top-1]) {queue.add(top-1); vis[top-1]=false;}
                                    
                                }
                                if(num1==5) cnt++;
                            }
            System.out.println(cnt);
        }
    }
  • 相关阅读:
    洛谷
    洛谷
    洛谷
    模板
    洛谷
    洛谷
    Codeforces Round #561 (Div. 2) E. The LCMs Must be Large(数学)
    Codeforces Round #561 (Div. 2)
    Mail.Ru Cup 2018 Round 2 C. Lucky Days(拓展欧几里得)
    The 10th Shandong Provincial Collegiate Programming Contest H.Tokens on the Segments(贪心+优先级队列 or 贪心+暴力)
  • 原文地址:https://www.cnblogs.com/Lemon1234/p/10585415.html
Copyright © 2020-2023  润新知