N皇后问题

N个皇后放在N*N的棋盘上,要求皇后不互相攻击。问皇后的摆法。

皇后攻击的条件:同一列,或者在对角线上

思想:采用递归。假设前面k-1个皇后都放好了,判定第k个皇后放置的位置

代码:


#include <cmath>
using namespace std;
int N;
int queenPos[100];  //用来存放算好的皇后位置。最左上角是(0,0)
void NQueen(int k);   //假定0-k-1行的皇后都放好了,现在开始第k行 
int main()
{
    cin>>N;
    NQueen(0);  //从第0行开始摆皇后
    return 0; 
 } 
 //在0-k-1行皇后已经摆好的情况下,摆第k行及其后的皇后 
 void NQueen(int k) 
 {
     int i;
     if(k==N)
     {
         for(i=0;i<N;i++)
           cout<<queenPos[i]+1<<" ";
         cout<<endl;
         return;
      } 
    for(i=0;i<N;i++)    //逐个尝试第k个皇后的位置      i代表列
    {
        int j;
        for(j=0;j<k;j++)    //j代表前面摆好的第j行的皇后 
        {
            //和已经摆好的k个皇后的位置比较,看是否冲突
            if(queenPos[j]==i||abs(queenPos[j]-i)==abs(k-j))   //abs(queenPos[j]-i)==abs(k-j)表示行的差和列的差相等即是在对角线上 
            {
                break;     //冲突,则试下一个位置 
             }     
    }
    if(j==k)   //当前选的位置i(第i列)不冲突 
    {
      queenPos[k]=i;   //将第k个皇后摆放在位置i 
      NQueen(k+1); 
    } 
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值