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
相关产品推荐
相关产品推荐

