方格填数
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
//方格填数
public class Main{
static int cnt=0;
static boolean []vis = new boolean[10]; //标记每个数是否被访问
static int [][]table = new int[3][4];
public static void main(String[] args)
{
for(int i = 0;i<3;i++){
for(int j=0;j<4;j++){
table[i][j] = -2; //全部设置为-2
}
}
for(int j=0;j<10;j++){
vis[j] = false;
}
dfs(table,0,1);
System.out.print(cnt);
}
private static void dfs(int[][] table, int i, int j) {
if(i==2 && j==3){
cnt++;
return;
}
for(int t=0;t<10;t++){
boolean flag = check(t,i,j); //检查t是否可以填入
if(flag == true && vis[t] == false)
{
table[i][j] = t;
vis[t] = true;
dfs(table,i+(j+1)/4,(j+1)%4);
table[i][j] = -2;
vis[t] = false;
}
}
}
//判断相邻格子的数字是否连续
private static boolean check(int num, int i, int j) {
if(i-1>=0 && (table[i-1][j] == num+1 || table[i-1][j] == num-1)){ //判断上方格子
return false ;
}
if(j-1>=0 && (table[i][j-1] == num+1 || table[i][j-1] == num -1)){ //判断左方格子
return false ;
}
if(i-1>=0 && j-1 >= 0 && (table[i-1][j-1] == num+1 || table[i-1][j-1] == num - 1)){ //判断左上方格子
return false ;
}
if(i-1>=0 && j+1 < 4 && (table[i-1][j+1] ==num+1 || table[i-1][j+1] == num - 1)){ //判断右上方格子
return false ;
}
if(j+1<4 && (table[i][j+1] == num+1 || table[i][j+1] == num-1)){ //判断右方格子
return false ;
}
if(i+1<3 && (table[i+1][j] == num+1 || table[i+1][j] == num-1)){ //判断下方格子
return false ;
}
if(i+1<3 && j-1>=0 && (table[i+1][j-1] == num+1 || table[i+1][j-1] == num-1)){ //判断左下方格子
return false ;
}
if(i-1<0 && j+1<4 && (table[i+1][j+1] == num+1 || table[i+1][j+1] == num-1)){ //判断右下方格子
return false ;
}
return true ;
}
}
来源:CSDN
作者:S_123789
链接:https://blog.csdn.net/S_123789/article/details/104620264