方格填数
如下的10个格子
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
解题思路:深搜,从第一个位置开始,一行一行填,遇到不满足的返回上一步,直到十个位置都填满数,深搜一定要回溯。
public class Demo_7_06 {
static int count=0;
public static void main(String[] args) {
int[][] arr=new int[3][4];
for(int i=0;i<3;i++) {
for(int j=0;j<4;j++) {
arr[i][j]=-3;
}
}
dfs(arr,0);
System.out.println(count);
}
public static void dfs(int[][] arr,int n) {
//说明最后一个数也填进去了,总数加1
if(n==10) {
count++;
return;
}
for(int i=0;i<3;i++) {
for(int j=0;j<4;j++) {
//去掉不满足题意的第一个和最后一个位置
if(i==0&&j==0||i==2&&j==3)continue;
if(check(arr,i,j,n)) {
arr[i][j]=n;
dfs(arr,n+1);
//不满足条件一定要回溯
arr[i][j]=-3;
}
}
}
}
public static boolean check(int[][] arr,int x,int y,int n) {
if(arr[x][y]!=-3)return false;
for(int i=x-1;i<x+1;i++) {
for(int j=y-1;j<y+1;j++) {
//向左向有移动可能会越界,遇到直接跳过
if(i==-1||i==3||j==-1||j==4)continue;
//自己本身直接跳过
if(i==x&&j==y)continue;
//相邻的条件是上下左右都差一
if(Math.abs(arr[i][j]-n)==1) {
return false;
}
}
}
return true;
}
}
输出:509538