N皇后问题

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

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

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

代码:


#include
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            cout<          cout<          return;
      } 
    for(i=0;i     {
        int j;
        for(j=0;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); 
    } 
   }
}

你可能感兴趣的:(算法)