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

