八皇后问题

来源:互联网 发布:魔女的条件知乎 编辑:程序博客网 时间:2024/06/05 11:12

/*开一个数组pxy[20],若皇后在map[x][y]放下就pxy[y-x+n]=1,,在拿走皇后时就pxy[y-x+n]=0+n是为了防止数组越界*/

#include<iostream>#include<cstdio>using namespace std;int map[20][20],n,px[20],pxy[20],px_y[40],ans[20],ansnum; void search(int x)//search函数,状态就是行。 {    if(x==n)//之前在接龙题见过,就是在循环中i<n但在函数里面还有一个 //到达递归出口,得到一个新的方案,方案数+1;  //if语句判断x==n;     {        if(ansnum<3)//要求输出前三组,要加一个判断         {            for(int tt=0;tt<n;tt++)                 cout<<ans[tt]+1<<" "; //map[][]从0,0写入,结果要加一             cout<<endl;//上面那行是个注意点,考试的时候勿忘细节!             // 为什么 if(ansnum<3)在头上吗?   /*   因为,search从一开始,如果ansnum小于3,所以先输出。    */         }        ansnum++;//上面已解释         return;    }    /* 列从0到n-1开始搜索啊,(t为列!) !!!!以列为中心搜索  如果x,y,对角线都为零就是没走过的时候,把列设为已走过 行设为已走过,对角线也设为已走过。 注意:ans数组为记录答案的作用,有思考的韵味! 然后又进行了dfs搜索,然后变量重置(套路)  */     for(int t=0;t<n;t++)//从0到n-1以列开始搜索!     {        if(px[t]==0&&pxy[t-x+n]==0&&px_y[t+x]==0)         {    //px[t]表示t列所在的行                  map[x][t]=1;            px[t]=1;pxy[t-x+n]=1;px_y[t+x]=1;//尝试理解!             ans[x]=t;//记录答案             search(x+1);//搜索下一列             px[t]=0;pxy[t-x+n]=0;px_y[t+x]=0;//恢复         }    }}int main(){    cin>>n;    search(0);//从0开始search,个人觉得可以从1开始!     cout<<ansnum;//输出答案     return 0;}

原创粉丝点击