#include<iostream>
#include<cmath>
using namespace std;
int x[1000];
int Place(int k) // 此函数判断皇后能不能放入当前位置
{
for(int i=0;i<k;i++)
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k)) // 两个皇后是否在同一列以及是否成斜线
return 0;
return 1;
}
void NQueens(int n) // 回溯出口的条件
{
int k=0,s=0;
x[k]=-1;
while(k>=0)
{
x[k]=x[k]+1; // 将棋子移到棋盘内
while(x[k]<n && !Place(k)) // 如果此处可以放则继续执行,否则将皇后往后移动一格
x[k]=x[k]+1;
if(x[k]<n) // 判断棋子移出棋盘界外没有
{
if(k<n-1) // 放下一个皇后,并将下一行的皇后准备好
{
k=k+1;
x[k]=-1;
}
else
s++; // 放完了就结果加一
}
else
k=k-1;
}
cout<<s<<endl; // 棋子已经出界则返回上一行
}
main()
{
int n;
while(cin>>n)
NQueens(n);
}
N皇后问题(回溯法)
最新推荐文章于 2020-05-01 15:35:27 发布