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

C++实现Kattis编程题时多维数组致程序无法输入问题排查

问题描述

在解决Kattis平台10kindsofpeople编程题时出现运行异常:标记数组brr定义为一维数组时程序运行完全正常,改为多维数组后,程序启动后立刻终止,无法进入输入环节接收用户输入。
题目链接:10 Kinds of People
异常代码如下:

#include <bits/stdc++.h>
using namespace std;
int r,c;
char arr[1005][1005];
void cari(int brr[][1005], int r1, int c1, int r2, int c2, bool &cek, char type){
    if(r1 == r2 && c1 == c2){
        if(type == arr[r2][c2]) cek = 1;
        return;
    }else if (r1 >= 1 && r1 <= r && c1 >= 1 && c1 <= c && type == arr[r1][c1] && brr[r1][c1] != 1){
        brr[r1][c1] = 1;
        cari(brr,r1-1, c1,r2,c2,cek,type);
        cari(brr,r1,c1+1,r2,c2,cek,type);
        cari(brr,r1,c1-1,r2,c2,cek,type);
        cari(brr,r1+1,c1,r2,c2,cek,type);
    }
}

int main (){
    cin >> r >> c;
    for(int i = 1; i <= r; i++){
        string s;
        cin >> s;
        for(int j = 1; j <= c; j++){
            arr[i][j] = s[j - 1];
        }
    }
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
        int r1,c1,r2,c2;
        int brr[1005][1005];
        bool cek = 0;
        cin >> r1 >> c1 >> r2 >> c2;
        cari(brr,r1,c1,r2,c2,cek,arr[r1][c1]);
        if(cek && arr[r1][c1] == '0') cout << "binary" << endl;
        else if(cek && arr[r1][c1] == '1') cout << "decimal" << endl;
        else cout << "neither" << endl;
    }
}
问题根源
  • 直接原因是栈内存溢出:循环内定义的局部数组int brr[1005][1005]分配在栈空间,单个数组占用内存约为1005*1005*4 ≈ 4MB,而程序默认栈空间通常仅为1~8MB,加上递归调用cari函数会额外占用栈帧空间,总占用直接超过栈容量上限,触发段错误导致程序立即崩溃,根本执行不到后续的输入读取逻辑。一维数组版本未崩溃只是因为数组体积更小,未超出栈剩余容量,本质仍存在内存风险。
  • 隐藏逻辑缺陷:局部数组brr定义后未初始化,内存中残留随机垃圾值,会导致DFS的访问判断逻辑出错;且每次查询都重新初始化数组跑DFS,在查询量较大时会出现超时。
修复建议
  • 大体积数组不要定义为函数局部变量:将brr改为全局变量(全局变量存储在静态存储区,不受栈空间大小限制),或使用vector等动态分配内存的容器存储标记数组。
  • 优化算法逻辑:提前通过一次全图Flood Fill或并查集预处理所有连通块,给每个连通块打上唯一标记并记录块的类型(0/1),后续每个查询直接对比两个点的连通块标记即可,无需每次查询都重新遍历,大幅降低时间开销。
  • 局部数组使用前必须手动初始化为0,避免垃圾值干扰逻辑判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 10:09:45