background:给朋友讲题,顺便过了这道几年前遗留的题
P1219 [USACO1.5]八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
dfs直接去搜
我这里用的pos[ ]是存储这个图
p[ ]表示撇下来的对角线;对应的 q[ ] 则表示捺 下来的对角线
c[ ]表示列
pos[i]=j; //记录第i行放在了第j列
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 80;
int pos[N],c[N],p[N],q[N];
int n,ans;
//void print()
//{
// if(ans <= 3)
// {
// for(int i = 1;i <= n;i++) printf("%d ",pos[i]);
// puts("");
//}
//}
void dfs(int i)
{
if(i > n)
{
ans++;
if(ans <= 3){
for(int i= 1;i <= n;i++)printf("%d ",pos[i]);
puts("");}
return;
}
for(int j = 1;j <= n;j++)
{
if(c[j] || p[i+j] || q[i - j + n])continue;
pos[i] = j;
c[j] = p[i+j] = q[i-j+n] = 1;
dfs(i+1);
c[j] = p[i+j] = q[i-j+n] = 0;
}
}
int main()
{
cin>>n;
dfs(1);
cout<<ans<<endl;
return 0;
}