首页 > 其他 > 详细

方格填数

时间:2019-03-14 23:25:08      阅读:177      评论:0      收藏:0      [点我收藏+]
方格填数

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!