方格填數
阿新 • • 發佈:2019-03-15
提交 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]){ returnfalse; } } 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
方格填數