方格填数 蓝桥杯

方格填数

如下的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

原文地址:https://www.cnblogs.com/chiweiming/p/10533407.html