• 方格填数 蓝桥杯


    方格填数
    
    如下的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

  • 相关阅读:
    编译nginx时openssl报错的解决方案
    编译nginx时make报错[-Werror=implicit-fallthrough=]的解决方案
    centos8下编译安装tomcat
    解决centos安装不上apache:No match for argument: httpd
    编译安装apache
    编译apache出现gcc: error: /usr/lib/rpm/redhat/redhat-hardened-ld: No such file or directory
    配置与管理FTP服务器
    2018icpc南京现场赛-I Magic Potion(最大流)
    Codeforces 1062B Math(质因数分解)
    BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)
  • 原文地址:https://www.cnblogs.com/chiweiming/p/10533407.html
Copyright © 2020-2023  润新知