方格填数
如下的10个格子

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
【分析】标准的dfs。
//方格填数
public class day02prc2 {
static int res=0;
static int [][]table = new int[3][4];
static int []vis = new int[10]; //标识数字是否用了
public static void main(String []args){
for(int i=0;i<3;i++){
for(int j=0;j<4;j++)
table[i][j] = -2;
}
for(int i=0;i<10;i++)
vis[i] = 0; //未访问
dfs(0,1);
System.out.print(res);
}
private static void dfs(int i, int j) {
if(i==2 && j==3){
res++;
return;
}
for(int k=0;k<10;k++){
if(!check(i,j,k) || vis[k]==1)
continue;
table[i][j] = k;
vis[k] = 1;
dfs(i+(j+1)/4,(j+1)%4);
table[i][j] = -2;
vis[k] = 0;
}
}
private static boolean check(int i, int j,int k) {
//上方格子
if(i-1>=0 && (table[i-1][j] == k+1 || table[i-1][j] == k-1))
return false;
//左方格子
if(j-1>=0 && (table[i][j-1] == k+1 || table[i][j-1] == k-1))
return false;
//斜右上格子
if(i-1>=0 && j+1<=3 && (table[i-1][j+1] == k-1 || table[i-1][j+1] == k+1))
return false;
//斜左上格子
if(i-1>=0 && j-1>=0 && (table[i-1][j-1] == k-1 || table[i-1][j-1] == k+1))
return false;
return true;
}
}
这篇博客探讨了如何用深度优先搜索(DFS)解决一个填数问题,即在一个10格的方格中填入0~9的数字,且连续数字不能相邻(包括左右、上下和对角)。博客介绍了这个问题的分析和DFS的应用。
2146

被折叠的 条评论
为什么被折叠?



