P1219 [USACO1.5]八皇后 Checker Challenge
#include<cstdio>
using namespace std;
int N;//代表是N皇后问题
//bool H[100];//将来的剪纸操作代表某一行不在搜索
bool L[100];//将来的剪纸操作代表某一列不在搜索
bool D1[100];//将来的剪纸操作代表对角线元素不在搜索,,,,是主对角线
bool D2[100];//,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,是副对角线
int locate[100];//其中locate[0][i]=j代表是第一个解,第i行j列存在一个皇后棋
//应该将行保存为全局变量
int m=0;
//解的总数(((((((((没用))))))))))))
int total=0;
void DFS(int t)//t代表的是本状态皇后所在行的位置,m代表的是第几组解
{
//什么时候函数返回:t为第N+1行时即此时已经保存结果于locate[j]中
if(t > N)
{
//打印结果
//注意只打印三组解
if(total<3)
{
for (int i = 1; i <= N; i++) {
printf("%d ", locate[i]);
}
//输出完答应一个换行符
printf("\n");
}
total++;//解总数增加
return;
}
//枚举皇后在每一个列的位置
for(int j=1;j<=N;j++)
{
if( (L[j] == false) && (D1[t+j] == false) && (D2[t-j+N] == false) )
//本行本列本对角都可以放皇后
{
locate[t]=j;//于第m组解中,第t行第j列放上皇后
// H[t]=false;
L[j]=true;
D1[t+j]=true;
D2[t-j+N]=true;
DFS(t+1);
// H[t]=true;
L[j]=false;
D1[t+j]=false;
D2[t-j+N]=false;
}
}
}
int main()
{
scanf("%d",&N);//输入是几皇后问题
for(int i=1;i<=N;i++)
{
//初始化所有的剪枝数组
// H[i]=true;
L[i]=false;
D1[i]=false;
D2[i]=false;
}
//仅需要输出三组解
DFS(1);//从第一行第一列开始遍历
printf("%d",total);
}