欢迎光临散文网 会员登陆 & 注册

P1219 [USACO1.5]八皇后 Checker Challenge

2023-02-28 19:47 作者:仓鼠翞  | 我要投稿

#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);
}

P1219 [USACO1.5]八皇后 Checker Challenge的评论 (共 条)

分享到微博请遵守国家法律