[蓝桥杯2016初赛]方格填数

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

原文地址:https://www.cnblogs.com/lifehappy/p/12601205.html