当第一次for循环中的j>n时,会跳转到哪里,怎么回到开头



#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皇后问题的求解。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^