【解题报告】洛谷P1219 八皇后

【解题报告】洛谷P1219 八皇后

题目链接

https://www.luogu.com.cn/problem/P1219

思路

这个的话,直接搜索吧

唯一需要注意的就是如何表示行或者列,或者对角线已经被选择了

其中对角线就直接加起来就好了

另一条对角线就直接用一个新的数组,然后也转化成相加相等的形式就可以了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int maxn=30;
int n;
int cnt;
bool hang[maxn],lie[maxn],dj[maxn],dj2[maxn];
int rec[maxn];
void dfs(int x)
{
	if(x==n)
	{
		cnt++;
		if(cnt<=3)
		{
			for(int i=1;i<=n;i++)
			cout<<rec[i]<<" ";
			cout<<'\n';
			return ;
		}
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(lie[i]||dj[x+1+i]||dj2[x+1+(n-i)]) continue;
		lie[i]=true;
		dj[x+1+i]=true;
		dj2[x+1+(n-i)]=true;
		rec[x+1]=i;
		dfs(x+1);
		rec[x+1]=0;
		dj2[x+1+(n-i)]=false;
		dj[x+1+i]=false;
		lie[i]=false;
	}
}
int main()
{
	cin>>n;
	dfs(0);
	cout<<cnt<<'\n';
	return 0;
}
posted @ 2021-10-15 20:18  wweiyi  阅读(51)  评论(0编辑  收藏  举报
js脚本