zoukankan      html  css  js  c++  java
  • 方格填数 蓝桥杯

    方格填数
    
    如下的10个格子
       +--+--+--+
       |  |  |  |
    +--+--+--+--+
    |  |  |  |  |
    +--+--+--+--+
    |  |  |  |
    +--+--+--+
    
    (如果显示有问题,也可以参看【图1.jpg】)
    
    填入0~9的数字。要求:连续的两个数字不能相邻。
    (左右、上下、对角都算相邻)
    
    一共有多少种可能的填数方案?
    
    请填写表示方案数目的整数。
    注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

    DFS解决:

    递归每个格子依次放入0~9,放入数字前判断是否满足条件:

    • 判断当前数字是否被使用
    • 判断相邻格子是否连续

    主要是判断条件,其他设计都很简单。

    public class Main{
        
        static long res=0;
        static int book[]=new int[10];
        static int arr[][]=new int[3][4];
        
        static boolean judge(int i,int j,int value){
            if(i-1>=0){    //
                if(value-1==arr[i-1][j] || value+1==arr[i-1][j]){
                    return false;
                }
            }
            if(i+1<=2){    //
                if(value-1==arr[i+1][j] || value+1==arr[i+1][j]){
                    return false;
                }
            }
            if(j-1>=0){    //
                if(value-1==arr[i][j-1] || value+1==arr[i][j-1]){
                    return false;
                }
            }
            if(j+1<=3){    //
                if(value-1==arr[i][j+1] || value+1==arr[i][j+1]){
                    return false;
                }
            }
            if(i-1>=0 && j-1>=0){    //左上角
                if(value-1==arr[i-1][j-1] || value+1==arr[i-1][j-1]){
                    return false;
                }
            }
            if(i+1<=2 && j+1<=3){    //右下角
                if(value-1==arr[i+1][j+1] || value+1==arr[i+1][j+1]){
                    return false;
                }
            }
            if(i+1<=2 && j-1>=0){    //左下角
                if(value-1==arr[i+1][j-1] || value+1==arr[i+1][j-1]){
                    return false;
                }
            }
            if(i-1>=0 && j+1<=3){    //右下角
                if(value-1==arr[i-1][j+1] || value+1==arr[i-1][j+1]){
                    return false;
                }
            }
            return true;
        }
        
        static void solve(int i,int j){
            if(i==2 && j==3){
                res++;
                return;
            }
            for(int k=0;k<10;k++){
                if(book[k]==0 && judge(i,j,k)==true){
                    book[k]=1;
                    arr[i][j]=k;
                    if(i==0 && j==3){
                        solve(i+1,0);
                    }else if(i==1 && j==3){
                        solve(i+1,0);
                    }else{
                        solve(i,j+1);
                    }
                    arr[i][j]=-10;
                    book[k]=0;
                }
            }
        }
    
        public static void main(String[] args){
            for(int i=0;i<=2;i++){
                for(int j=0;j<=3;j++){
                    arr[i][j]=-10;
                }
            }
            solve(0,1);
            System.out.println(res);
        }
    }

    答案:1580

  • 相关阅读:
    2016.11.9 小测试
    【noip】跟着洛谷刷noip题2
    【长沙集训】2017.10.10
    【noip】跟着洛谷刷noip题
    Oracle-函数-translate
    bit,byte,char,string区别与基本类型认识
    通俗地讲,Netty 能做什么?
    oracle判断一个字符串中是否包含另外一个字符串
    Oracle导入导出数据库(exp/imp和expdp/impdp的区别)
    同步异步以及阻塞和非阻塞的区别
  • 原文地址:https://www.cnblogs.com/chiweiming/p/10533407.html
Copyright © 2011-2022 走看看