方格填數
如下的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 ;
}
}