题目
如图,如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)一共有多少种可能的填数方案?
思路
1.参照前一篇2×5方格填数,我们依旧采用DFS,只需将判断条件作相应变化。
2.考虑到格子的不规范性,我们可构造更大矩阵包住它,这样的好处在于方便判断是否满足“不能相邻”。如图,不必考虑越界,只需将红色区的每个空格所填数与周围8个数比较即可。
代码
#include<iostream>
#include<cmath>
using namespace std;
const int inf=999;
int sum=0;//计数
int a[5][6];//空格
int flag[10]={0};//标记
bool check(int x, int y){//判断填入符合与否
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
if(abs(a[x][y]-a[x+i][y+j])==1)return false;
}
}
return true;
}
void DFS_in(int x,int y){//填空
if(x==3&&y==4){//填满回朔
sum++;
//print();
return;
}
for(int i=1;i<=10;i++){
if(!flag[i]){
a[x][y]=i;
flag[i]=1;//已使用
if(check(x,y)){//下一次深入
if(y<4)DFS_in(x,y+1);
else DFS_in(x+1,1);
}
flag[i]=0;//回朔
a[x][y]=inf;//!!!置空
}
}
}
int main(){
for(int i=0;i<5;i++)for(int j=0;j<6;j++)a[i][j]=inf;
DFS_in(1,2);//从(1,2)开始
cout<<sum;
}