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