正如题目,我们要保证相邻的数不相连就行了,一共要填十个数。
下面是我的思路,供大家参考一下,
我把上面的各子放进了这个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。