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

回溯法求解N皇后问题代码结果异常及重复打印问题排查

N皇后代码问题解答

第一版代码错误说明

你这版代码的核心问题有两个:

  • 标记回溯逻辑错误:你直接用当前递归层数y作为危险区的标记值,回溯时直接把和当前皇后相关的格子重置为-1,但这些格子很可能同时被上层递归的皇后标记为危险区,这步重置会直接抹掉上层的危险标记,导致后续可以在本应禁止放皇后的位置放置皇后,结果完全不符合预期。
  • 语法错误:main函数里的v.resize(n,vector<int>(n,-1);少了一个右括号,正确写法是v.resize(n,vector<int>(n,-1));,否则代码无法编译通过。

第二版调试疑问解答

为什么每个i会对应两次打印

你在代码里主动加了两个打印逻辑:递归调用 solve(y+1)前打印一次棋盘,回溯完成后又打印一次棋盘,每个符合准入条件(v[y][i]==-1)的i都会触发这两次打印,这是你自己加的调试代码导致的。

为什么看起来每个i会打印4次、触发2次调用

因为递归是嵌套执行的,上层y的i处理过程中会调用下层y+1的solve函数,下层所有的打印内容都会穿插在上层的两次打印之间,如果你没有按调用层级区分打印内容,就会把上下层的打印混在一起数,误以为同一个i触发了多次调用、打印了多次。
举个简单例子:y=0的i=0进入处理流程,先执行第一次打印,然后调用y=1的solve函数,y=1层级的所有打印内容都会先输出,等y=1的solve完全返回后,y=0的i=0才会执行第二次打印,混着数的话自然会觉得打印次数翻倍。

补充优化建议

你目前用二维数组标记危险区的方式效率低还容易出错,标准N皇后解法可以用三个一维布尔数组分别记录列、左对角线(行-列值固定)、右对角线(行+列值固定)的占用状态,就不会出现标记被覆盖的问题。

内容的提问来源于stack exchange,提问作者Atef Nazi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 14:36:04