N皇后问题

N皇后问题

已知在 N*N 的棋盘上放置 N 个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置 2 个皇后).

思路定义一个函数,函数里的变量用于计数。数组用于放数,数组b表示位置标记(使皇后互不攻击)。从第一个皇后开始深搜,搜索时运用回溯判定即可。然后就是找出口,出口当然是搜索次数sum 大于n或者等于n + 1的时候,进行输出;也可能是sum=0,无解。

代码如下:

#include<cstdio>

#include<iostream>

#include<cstdlib>

#include<iomanip>

using namespace std;

int a[105],b1[105],b2[105],b3[105];//

int n,sum=0;

 

void print()//输出

{

    sum+ +;

     for(int i=1;i<=n;i++)

     printf("%5d",a[i]);

     printf("\n");

}

 

void dfs(int j)//深搜  j是皇后所在的行

{

     if(j>n)

     {

         print();

         return;

     }

     for(int i=1;i<=n;i++)//遍历  i是皇后所在的列

      if((b1[i]==0)&&(b2[i+j]==0)&&(b3[j-i+15]==0))

      {

         a[j]=i;

         b1[i]=1;//占领i

         b2[i+j]=1;//占领对角线,从右上到左下

         b3[j-i+15]=1;//占领对角线,从左上到右下

         dfs(j+1);//递归

         b1[i]=0;//回溯

         b2[j+i]=0;

         b3[j-i+15]=0;

      }

}

 

int main()

{

     cin>>n;

     dfs(1);

     if(sum==0)//特殊

      cout<<"no solute!"<<endl;

     return 0;

}

posted @ 2022-08-23 16:40  shanyingrui  阅读(117)  评论(0编辑  收藏  举报