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

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;
}

问题分析与修复

  1. heap-buffer-overflow错误原因
    make_chessboard函数中,当row == board.size()时,仅执行了ans.push_back(board)但未添加return语句。这会导致代码继续执行后续的for循环,此时row等于棋盘大小(vector下标范围是0到n-1),访问board[row]会触发数组越界,引发heap-buffer-overflow。

  2. 本地无输出的可能原因

  • 若输入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 08:35:26