P1219 八皇后 Checker Challenge


思路:
1.ch[i]存放列下标
2.dfs(i)代表现在遍历第几行
合法判断:
三个一维数组,分别判断三个方向:
(1)(按行放置,则不用检查行冲突)
(2)lie[j]记录(任意一行的)第j列有没有放过棋子
(3)xie1[i-j+n]记录第i-j+n号主对角线有没有放过棋子
(4)xie2[i+j]记录第i+j号副对角线有没有放过棋子
#include<bits/stdc++.h>
#define MAXN 15
using namespace std;
int n,cnt,ch[MAXN],lie[MAXN],xie1[MAXN*2],xie2[MAXN*2];
void dfs(int i)
{
if(i==n+1){
cnt++;//合法方案 总数加一
if(cnt>3) return;//只输出前三种
for(int k=1;k<=n;++k){
printf("%d ",ch[k]);
}
printf("\n");
return ;
}
for(int j=1;j<=n;++j){
if(lie[j]||xie1[i-j+n]||xie2[i+j]) continue;
lie[j]=1,xie1[i-j+n]=1,xie2[i+j]=1;
ch[i]=j;
dfs(i+1);
lie[j]=0,xie1[i-j+n]=0,xie2[i+j]=0;
ch[i]=0;
}
}
int main()
{
cin>>n;
dfs(1);
cout<<cnt;
return 0;
}

浙公网安备 33010602011771号