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

