#include<stdio.h>
#include<math.h>//或者引入cmath这个库,因为要用abs(),绝对值函数
using namespace std;
int n;//全局变量n,用于在 void DFS() 中求几皇后的问题,同时对于求共多少种情况起着调节作用
int sum;//单次的结果
int lie[20];//记录每个皇后在每行所对应的列
int jieguo[20];//用来记录最终结果
bool judge(int line);//该函数的功能为判断该皇后的位置是否符合要求
bool judge(int line)
{
int i;
for(i=1;i<line;i++)//判断该皇后所在位置与之前的皇后的位置是否不符合要求
{
if(lie[line]==lie[i]||abs(line-i)==abs(lie[line]-lie[i]))//如果之前有皇后的位置与此皇后的位置在一列或者在该皇后的斜行上话,则说明此皇后位置选择的有问题,返回False
{
return false;
}
}
return true;
}
void DFS(int number);//形参number的意思为第几行,默认为1,即从第一行开始找
void DFS(int number)
{
if(number>n)//当number大于N(n)的时候,也就是说每个皇后都已经找到了自己的位置了,那么总的情况就加1
{
sum++;
}
int i;
for(i=1;i<=n;i++)//i表示的是从number行列 开始 从1向右移动找出合适的列
{
lie[number]=i;//默认从第一列开始找寻
if(judge(number))//如果该位置可以的话,就可以找下一个皇后的位置//若不符合,则可直接剪掉此种情况
{
DFS(number+1);
}
}
}
int main()
{
int N,i;
for(i=1;i<=10;i++)//先算出所有情况
{
sum=0;
n=i;//将全局变量的值改变,改变为N;
DFS(1);
jieguo[i]=sum;
}
while(scanf("%d",&N)!=EOF)
{
if(N==0) {break;}
else {printf("%d\n",jieguo[N]);}
}
return 0;
}
创作不易,对您有帮助的话点个赞吧