【解题报告】洛谷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<<'
';
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<<'
';
return 0;
}