P1219 [USACO1.5] 八皇后 Checker Challenge(dfs,搜索斜杠上的点的方法)

斜杠\和反斜杠/的英文名称,它们分别是 "slash" 和 "backslash"

P1219 [USACO1.5] 八皇后 Checker Challenge(dfs,搜索斜杠上的点的方法)_第1张图片

P1219 [USACO1.5] 八皇后 Checker Challenge(dfs,搜索斜杠上的点的方法)_第2张图片 解题思路

使用dfs从深度1开始一层一层的向下搜索(y轴),所以定义x轴,斜杠,反斜杠三个bool数组判断是否搜索过,若深度到n+1则答案加一,输出前三个即可

再就是向下搜索,若那三个bool都未搜索过则进入dfs(搜索过就代表那个值为1,每一行每一列都只能有一个数)dfs完n后再返回到上一个节点,也就是n-1,再将n-1复原

问题关键 

如何判断已经搜索过斜着的线上的点?

P1219 [USACO1.5] 八皇后 Checker Challenge(dfs,搜索斜杠上的点的方法)_第3张图片

如图,一条斜着的线,它的dep+x或dep-x为定值,而为了避免dep-x小于0,再加上一个n即可

下为代码

#include
using namespace std;
using ll = long long;
int n;
int res = 0;
int ans[100];

bool slash[100];
bool backslash[100];
bool y[100];

void dfs(int dep){
	
	if(dep == n + 1)
	{
		res++;
		for(int j = 1; j <= n; j++)
		{
			if(res > 3) break;
			cout << ans[j] << ' ';
			if(j == n) cout << '\n';
		}
		return;
	}
	
	for(int i = 1; i <= n; i++)
	{
		if(!slash[dep - i + n] && !backslash[dep + i] && !y[i])
		{
			slash[dep - i + n] = true;
			backslash[dep + i] = true;
			y[i] = true;
			ans[dep] = i;
			dfs(dep + 1);
			slash[dep - i + n] = false;
			backslash[dep + i] = false;
			y[i] = false;
		}
	}
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n;
	//一行一行的搜索
	dfs(1);
	cout << res;
	return 0;
}

数组尽量开大点

你可能感兴趣的:(深度优先,算法,c++)