伪代码
代码如下
//回溯法 - 递归 - n皇后问题 - 所有解
//编译器:vs 2019
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int n = 0; //n皇后的n
int x[80] = { 0 }; //存放解空间
int cnt = 0; //解个数
bool place(int k)
{
//判断第k行皇后和第k-1行皇后是否有冲突,有冲突则返回false,没有冲突则返回true
for(int i = 1; i < k; i++)
{
if (x[i] == x[k] || abs(i - k) == abs(x[i]-x[k]))
return false;
}
return true;
}
void output(int num[])
{
for (int i = 1; i <= n; i++)
printf("%d ",num[i]);
printf("\n");
}
bool nqueen(int k)
{
// printf("进入nqueen\n");
//在前k-1行已放置k-1互不攻击的皇后的情况下,求解n皇后问题并输出所有解
bool t = false; //先初始化标记
for (int i = 1; i <= n; i++)
{
x[k] = i; //尝试将n皇后放在第i列
if (place(k)) //如果第k行的当前位置可放置皇后
{
if (k == n)
{
t = true;
output(x);
cnt++;
}
else //是部分解
{
bool t1 = nqueen(k + 1); //递归调用
if (t1) t = true;
}
}
}
return t;
}
int main( )
{
scanf("%d",&n);
bool flag = nqueen(1);
if ( cnt )
printf("共%d个解",cnt);
if (flag == false)
printf("no solution !\n");
return 0;
}