不知道为什么一运行就直接退出了
#include
using namespace std;
int main()
{
int n, m, k;
int ans=0;
cout << "输入行数、列数、最大值" << endl;
cin >> n >> m >> k;
int a[500][500],s[500][500];//定义一个n行m列的矩阵
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
s[i][j] = s[i - 1][j] + s[i][j - 1] + a[i][j] - a[i - 1][j - 1];
}
}
for(int up=1;up<=n;up++)
for(int bu=up;bu<=n;bu++)
for(int left=1; left <=m; left++)
for (int right = left; right <= m; right++)
{
int sum = s[bu][right] - s[up - 1][right] - s[bu][left - 1] + s[up - 1][left - 1];
if (sum <= k)
ans++;
}
cout << ans << endl;
return 0;
}
(1)代码的问题
在第一个双层for循环中,给s[i[j]赋值的时候,i=0的时候s[i - 1][j]是 s[0][j],是一个未初始化的值,s[i][j - 1]和a[i - 1][j - 1]也是同样的问题,如果你想把他们的默认值设为0 的话,在声明变量的时候,把数组初始化一下:
int a[500][500]={0},s[500][500]={0};
(2)缓存大小的问题(一运行就终止的问题根源应该是这个原因)
你的数组开的太大了,缓存不够用了。a和s数组一共占用内存大小:
250000 * 4 * 2 = 2000000字节 ,约为 1953 K >1M,一般默认缓存是1M,你代码里申请的空间超出1M了。
解决方法有两种,一是减小数组大小,比如int a[200][200];改成多大看你题目的要求
二是,修改一下编译器的保留堆栈大小,如果你用的是Visual Studio 编译器,修改方法如下图所示:
我这里不修改这个数值的话也是一运行就终止了,修改后可以正常运行。