题目:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
如下的 10个格子
+–+–+–+
| | | |
+–+–+–+–+
| | | | |
+–+–+–+–+
| | | |
+–+–+–+
填入 0 ~ 9 的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
运行限制
代码:
public class Main { static int sum=0; static int[][] nums=new int[5][6]; static int[] vis=new int[10]; public static void main(String[] args) { fuzhi(); dfs(1,2); System.out.println(sum); } public static void fuzhi(){ 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){ 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; nums[x][y] = -10; } } } }
|
思路:
用DFS解题
首先我们要将题目中给的十个格子表示出来,这里我们用一个5行6列的数组(nums【5】【6】)取num【1】【2】到nums【3】【4】来表示。
首先我们先将nums【5】【6】全部赋值为-10避免影响对相邻格子里面的数是否连续的判断。
然后用vis数组存储每个数字是否使用过,接着我们就开始写dfs函数从十个数中选择任意一个数字进行判断填入,具体思路见代码中的注释。