简单C++代码上的运行时错误信号11

Runtime Error signal 11 on simple C++ code

本文关键字:运行时错误 信号 C++ 代码 简单      更新时间:2023-10-16

我在这段代码中遇到了一个运行时错误,我不知道为什么。我正在创建一个网格,然后在上面运行BFS。这里的目标是读取网格的行和列,然后确定在到达终点之前可以经过的最大恒星数量。起点在左上角,终点在右下角。你只能左右移动。有什么想法吗?

#include <iostream>
#include <queue>
using namespace std;
int main() {
    int r, c, stars[1001][1001], grid[1001][1001], ns[1001][1001];
    pair<int, int> cr, nx;
    char tmp;
    queue<pair<int, int> > q;
    cin >> r >> c;
    for(int i = 0; i < r; i++) {
        for(int j = 0; j < c; j++) {
            cin >> tmp;
            if(tmp == '.') {
                grid[i][j] = 1000000000;
                ns[i][j] = 0;
                stars[i][j] = 0;
            }
            else if(tmp == '*') {
                grid[i][j] = 1000000000;
                ns[i][j] = 1;
                stars[i][j] = 1;
            }
            else
                grid[i][j] = -1;
        }
    }
    grid[0][0] = 0;
    cr.first = 0;
    cr.second = 0;
    q.push(cr);
    while(!q.empty()) {
        cr = q.front();
        q.pop();
        if(cr.first < r - 1 && grid[cr.first + 1][cr.second] != -1 && ns[cr.first][cr.second] + stars[cr.first + 1][cr.second] > ns[cr.first + 1][cr.second]) {
            nx.first = cr.first + 1; nx.second = cr.second;
            grid[nx.first][nx.second] = grid[cr.first][cr.second] + 1;
            ns[nx.first][nx.second] = ns[cr.first][cr.second] + stars[cr.first + 1][cr.second];
            q.push(nx);
        }
        if(cr.second < c - 1 && grid[cr.first][cr.second + 1] != -1 && ns[cr.first][cr.second] + stars[cr.first][cr.second + 1] > ns[cr.first][cr.second + 1]) {
            nx.first = cr.first; nx.second = cr.second + 1;
            grid[nx.first][nx.second] = grid[cr.first][cr.second] + 1;
            ns[nx.first][nx.second] = ns[cr.first][cr.second] + stars[cr.first][cr.second + 1];
            q.push(nx);
        }
    }
    if(grid[r - 1][c - 1] == 1000000000)
        cout << "Impossible" << endl;
    else
        cout << ns[r - 1][c - 1] << endl;
}

样本输入:

6 7
.#*..#.
..*#...
#.....#
..###..
..##..*
*#.....

我猜你的堆栈不够大,不适合

int stars[1001][1001], grid[1001][1001], ns[1001][1001];

即CCD_ 1字节。如果int的大小为4个字节,则大约为12MB。

使用编译器选项增加堆栈大小,或者使用动态分配,即std::vector

为了避免大堆栈,您应该在堆上分配

既然你看起来有三个平行的二维数组,你可以也许可以创建包含x,y位置的所有三个值的结构。这将使其更容易维护:


struct Area 
{ 
  int grid; 
  int ns; 
  int stars; 
}; 
std::vector<std::array<Area,1001>> dim2(1001);
dim2[x][y].grid = 100001;
...