1. 程式人生 > >方格填數

方格填數

提交 sys rgs void value 數字 boolean int []

方格填數

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

方格填數