You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++与Python八皇后问题代码结果不一致,求C++代码错误排查

问题分析与解决:C++八皇后代码无输出的原因

嘿,我帮你找到问题啦!你的C++代码和Python代码逻辑看似一致,但有个关键的细节错误导致程序无法正确执行回溯,最终没有任何输出。

核心问题:错误修改了循环变量cnt

在C++的queen函数里,你写了这样的代码:

if(flag){
    cnt++;
    queen(arr,n,cnt);
}

这里的cnt++会直接修改当前函数栈中的cnt变量值。当递归返回后,后续的for循环迭代时,cnt已经不是原来的数值了,这会彻底打乱回溯的逻辑——程序无法回到当前行的初始状态去尝试下一列,自然遍历不到所有合法的皇后位置组合。

而你的Python代码里,传递的是cnt+1:

if flag:
    queen(A, cnt+1)

这种写法不会修改当前函数中的cnt变量,递归调用用的是临时计算的值,回溯时for循环的cnt依然保持初始状态,逻辑完全正确。

修改后的C++代码

只需要把修改cnt的代码改成传递cnt+1即可,其他逻辑保持不变:

#include <iostream>
#include <cmath>
using namespace std;
bool flag=true;
void queen(int *arr,int n,int cnt){
    if(cnt==n){
        for(int i=0;i<n;i++){
            cout<<arr[i]<<" ";
        }
        cout<<endl; // 建议加换行,让每种解法更清晰
        return;
    }
    for(int col=0;col<n;col++){
        arr[cnt]=col;
        flag=true;
        for(int row=0;row<cnt;row++){
            if(arr[row]==col||(abs(col-arr[row])==cnt-row)){
                flag=false;
                break;
            }
        }
        if(flag){
            // 直接传递cnt+1,不要修改当前的cnt
            queen(arr,n,cnt+1);
        }
    }
}
int main() {
    int n=8;
    // 注意:变长数组int arr[n]是C99特性,部分C++编译器不支持,建议改用动态分配
    int* arr = new int[n]();
    queen(arr,n,0);
    delete[] arr; // 记得释放内存
}

额外小提示

C中的int arr[n]={0};属于变长数组(VLA),这是C99标准引入的特性,并非所有C编译器都支持(比如MSVC)。更稳妥的做法是使用动态内存分配或者std::vector,避免潜在的兼容性问题。

修改后运行代码,就能看到和Python代码一样的92种八皇后解法输出啦!

内容的提问来源于stack exchange,提问作者Q.Shey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:21:19