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