#include <iostream>
#include<math.h>
using namespace std;
#define N 20 //最多皇后的个数
int q[N];//存放皇后所在列号
int count = 0;
void dispasolution(int n)//输出n皇后的一个解
{
printf(" 第%d个解:",++count);
for(int i = 1;i<=n;i++)
{
printf("(%d,%d)",i,q[i]);
}
printf("\n");
}
bool place(int i,int j)//测试第(i,j)能否放置皇后
{
if(i==1)
return true;
int k = 1;
while(k<i)//k从1到i-1是已经放置皇后的行
{
if((q[k]==j)||(abs(q[k]-j)==abs(i-k)))//如果前面行这列已经放置或者若放在对角线上,对角线已经被放置
return false;
k++;
}
return true;
}
void queen(int i,int n)//放置1~i个皇后
{
if(i > n) //所有皇后放置结束
dispasolution(n);
else
{
for(int j=1;j<=n;j++)//在第i行上试探每一个j
if(place(i,j))//如果在第i行上找到一个合适的j
{
q[i] = j;//放置
queen(i+1,n);//继续放置第i+1行
}
}
}
int main()
{
int n;
printf(" N皇后问题,n<20 n=");
scanf("%d",&n);
if(n>20)
printf("N值太大");
else
{
printf("N皇后解如下:\n",n);
queen(1,n);
}
}
循环条件不满足,会执行循环下面的那行,也就是 printf("\n");
要回到开头,需要加上 while 循环
void dispasolution(int n)//输出n皇后的一个解
{
while (1) {
printf(" 第%d个解:",++count);
for(int i = 1;i<=n;i++)
{
printf("(%d,%d)",i,q[i]);
}
}
printf("\n");
}
【以下回答由 GPT 生成】
当第一次for循环中的j>n时,程序会跳出for循环并继续执行下面的代码。在这段代码中,当j>n时,程序会执行queen(i+1,n)语句,即递归调用queen函数,并传入i+1和n作为参数。
在递归调用queen函数之后,程序会执行queen函数内部的for循环,其中j会重新从1开始循环。这样就实现了回到循环的开头,但是此时的i值已经增加了1。
通过这种递归调用和循环的结合使用,实现了对N皇后问题的求解。