N皇后代码出现heap-buffer-overflow问题,求排查解决方法
N皇后问题代码的heap-buffer-overflow及无输出问题排查
我编写了一段用于解决N皇后问题的C++代码,在LeetCode上运行时出现heap-buffer-overflow错误。修改代码后在本地运行,既未发现bug,也没有任何输出。我期望得到正确的N×N棋盘配置,代码如下:
#include<bits/stdc++.h> using namespace std; bool is_safe(vector<string> &board, int row, int col){ int x = row, y = col, n = board.size(); bool flag = true; while(x >= 0 && y < n){ if(board[x][y] == 'Q'){ flag = false; break; } x--; y++; } if(flag == false)return false; x = row, y = col; while(x >= 0 && y >= 0){ if(board[x][y] == 'Q'){ flag = false; break; } x--; y--; } if(flag == false)return false; x = row, y = col; while(x >= 0){ if(board[x][y] == 'Q'){ flag = false; break; } x--; } return flag; } void make_chessboard(vector<string>&board, int row, vector<vector<string>>&ans){ if(row == board.size()){ ans.push_back(board); } for(int j = 0; j < board[row].size(); j++){ if(is_safe(board, row, j)){ board[row][j] = 'Q'; make_chessboard(board,row+1,ans); board[row][j] = '.'; } } } int main(){ int n;cin >> n; vector<string> board(n,string(n,'.')); vector<vector<string>> ans; make_chessboard(board, 0, ans); for(int i = 0; i < ans.size(); i++){ for(int j = 0; j < ans[i].size(); j++){ cout << ans[i][j] << endl; } cout << endl << endl; } return 0; }
问题分析与修复
heap-buffer-overflow错误原因
make_chessboard函数中,当row == board.size()时,仅执行了ans.push_back(board)但未添加return语句。这会导致代码继续执行后续的for循环,此时row等于棋盘大小(vector下标范围是0到n-1),访问board[row]会触发数组越界,引发heap-buffer-overflow。本地无输出的可能原因
- 若输入的n为2或3,N皇后本身没有合法解,
ans为空,自然无输出; - 若输入n为有解的数值(如1、4、5),则是因为上述越界错误导致程序异常终止(部分环境可能静默终止),无法输出结果。
修改后的代码
仅需在make_chessboard的终止条件中添加return:
void make_chessboard(vector<string>&board, int row, vector<vector<string>>&ans){ if(row == board.size()){ ans.push_back(board); return; // 添加此return,避免越界访问 } for(int j = 0; j < board[row].size(); j++){ if(is_safe(board, row, j)){ board[row][j] = 'Q'; make_chessboard(board,row+1,ans); board[row][j] = '.'; } } }
修改后,输入有解的n值(如4)即可正常输出所有合法的N皇后棋盘配置;输入n=2、3时因无解仍无输出,属于正常情况。
内容的提问来源于stack exchange,提问作者dexter 247
相关产品推荐
相关产品推荐

