正如题目,我们要保证相邻的数不相连就行了,一共要填十个数。
下面是我的思路,供大家参考一下,
我把上面的各子放进了这个5*6的矩形,其中标记1–10的分别是要填数的各格子,一开始我先初始化这个二维数组为全部是0,然后从2~11开始填数,这里是一个关建,可以避免0和1是连续的数,减少不必要的判断,
从第一个数开始搜索标记为第一个数,
接下来的x坐标就是1+pos/4
y坐标就是pos-pos/4*4+1;
#include<iostream>
#include<cstring>
#include<cmath>
int ans[10][10];
int each[12],sum;
using namespace std;
bool judge(int x,int y,int now) {
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
if(abs(ans[x+i][y+j]-now)==1)
return false;
return true;
}
void dfs(int pos) {
if(pos==11) {
sum++;
return ;
}
for(int i=2;i<=11;i++) {
if(!each[i]) {
int x=1+pos/4;
int y=pos-pos/4*4+1;
if(judge(x,y,i)) {
each[i]=1;
ans[x][y]=i;
dfs(pos+1);
ans[x][y]=0;
each[i]=0;
}
}
}
}
int main()
{
sum=0;
memset(ans,0,sizeof(ans));
memset(each,0,sizeof(each));
dfs(1);
cout<<sum<<endl;
return 0;
}
最后答案应该是1580。