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

N皇后问题C++代码if判断未生效、程序无限循环问题求助

N皇后问题异常排查及修复

1. if判断不生效的直接原因

你check函数中右斜向冲突检测的边界条件存在笔误:

// 错误写法
if (column + n < n && board[m][column + n] == "Q") return false;

这里本要判断column + n没有超出棋盘列的最大边界(即小于k),但你误写为小于n,化简后等价于column < 0,这个条件永远不会成立。因此哪怕右斜上方已经存在皇后,该判断分支也永远不会触发,自然不会返回false,和你断点观测到的现象完全吻合。
修正后的判断应为:

if (column + n < k && board[m][column + n] == "Q") return false;

2. 其他逻辑问题

你现有代码的回溯逻辑设计存在明显缺陷,也是导致死循环、删除回溯代码后第三行放置错误的核心原因:

  • 直接在for循环中修改循环变量i、j的取值,逻辑非常不清晰,极易出现边界错误
  • 回退到上一行时,没有清除上一行已放置的皇后标记,board和QLocation的残留值会导致后续所有check判断出错
  • 删除回溯代码后第三行放置错误,本质就是check的右斜判断失效,无法检测到和上一行皇后的斜向冲突,才会放置在非法位置。

修正后的参考代码

#include <iostream>
#include <vector>
using namespace std;

int k = 4;
vector<vector<string>> board(k, vector<string>(k, "."));

bool check(int row, int column)
{
    // 检查同列
    for (int i = 0; i < row; i++) {
        if (board[i][column] == "Q") return false;
    }
    // 检查左斜上方
    for (int i = row - 1, j = column - 1; i >= 0 && j >= 0; i--, j--) {
        if (board[i][j] == "Q") return false;
    }
    // 检查右斜上方
    for (int i = row - 1, j = column + 1; i >= 0 && j < k; i--, j++) {
        if (board[i][j] == "Q") return false;
    }
    return true;
}

bool backtrack(int row)
{
    if (row == k) return true;
    for (int j = 0; j < k; j++) {
        if (check(row, j)) {
            board[row][j] = "Q";
            if (backtrack(row + 1)) return true;
            board[row][j] = "."; // 回溯清除
        }
    }
    return false;
}

int main()
{    
    backtrack(0);
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < k; j++)
            cout << board[i][j];
        cout << endl;
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:30:02