题目:

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

如下的 10个格子

+–+–+–+
| | | |
+–+–+–+–+
| | | | |
+–+–+–+–+
| | | |
+–+–+–+

填入 0 ~ 9 的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码:

public class Main {
static int sum=0; //存储结果
static int[][] nums=new int[5][6]; //用5行6列数组存储
static int[] vis=new int[10]; //记录0-9是否使用
public static void main(String[] args) {
fuzhi();
dfs(1,2); //dfs入口
System.out.println(sum);

}
public static void fuzhi(){ //将数组全赋值为-10避免影响对相邻是否连续的判断
for (int i=0;i<5;i++){
for (int j=0;j<6;j++){
nums[i][j]=-10;
}
}

}



public static boolean panduan(int x,int y){ //对所填数是否符合要求判断(相邻是否连续)
for(int i=x-1;i<=x+1;i++){
for(int j=y-1;j<=y+1;j++){
if(Math.abs(nums[i][j]-nums[x][y])==1)
return false;
}
}
return true;
}


public static void dfs(int x,int y){
if (x==3&&y==4){ //dfs出口
sum++;
return;
}
for (int i=0;i<10;i++){ //随机选一个数填入
if (vis[i]==0) { //没使用过则填入
nums[x][y] = i;
vis[i]=1;

if (!panduan(x, y)) { //相邻连续则复原
nums[x][y] = -10;
vis[i]=0;
continue;
}
if (y == 4) { //到第四列换行
dfs(x + 1, 1);
} else //不换行继续向右填入
dfs(x, y + 1);
vis[i] = 0; //dfs回溯
nums[x][y] = -10;
}
}
}

}

思路:

用DFS解题

首先我们要将题目中给的十个格子表示出来,这里我们用一个5行6列的数组(nums【5】【6】)取num【1】【2】到nums【3】【4】来表示。

首先我们先将nums【5】【6】全部赋值为-10避免影响对相邻格子里面的数是否连续的判断。

然后用vis数组存储每个数字是否使用过,接着我们就开始写dfs函数从十个数中选择任意一个数字进行判断填入,具体思路见代码中的注释。