我信誓旦旦的去洛谷网站刷题,结果被一道题的细节坑蒙了。切听我细细道来。
我刚开始,上来的思路就是三步走,
第一步,根据题目,创建所需要变量,
第二步,将座位信息,存储到二维数组中
第三步,用两个嵌套for循环,分别找连续空座位。
(对了,先把这道题正确的源代码,展现出来)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char zmh[2000][2000];
int main()
{
int n,m,k;
int i = 0;int j = 0;
int count = 0;int ans = 0;
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<n;i++)
{
scanf("%s",zmh[i]);
}
for(i=0;i<n;i++)
{
count = 0;
for(j=0;j<m;j++)
{
if(zmh[i][j] == '.')
count++;
else
count = 0;
if(count>=k)
{
ans++;
}
}
}
count = 0;
for(j=0;j<m;j++)
{
count = 0;
for(i=0;i<n;i++)
{
if(zmh[i][j] == '.')
count++;
else
count = 0;
if(count>=k)
{
ans++;
}
}
}
printf("%d",(k!=1 ? ans : ans/2));
return 0;
}
于是我就动手实践,首先我直接在局部变量中,创建一个二维数组(zmh[2000][2000])。不管后面错与否,我一运行,就会显示,内存分配溢出问题。我不断缩小定义的值,我发现就算减少一半仍会溢出。我当时想,会不会只是编译器问题,上传答案,应该能过,于是我去提交答案了,但是:
经过我在CSDN寻找,问题所在,我才知道,全局变量中才可以创建这么大的数组。修理完后
我又开始提交了。结果:
我去问善良的,姐姐,我本想循环输入3*3 = 9次的字符,存入二维数组中,为何我就输入了4次?
姐姐告诉我scanf会读取一个回车,(我才知道,上一次输入打入的空格是‘\n’,且上一个scanf读取字符时,在‘\n’停止,这次scanf去读取时,直接去读取‘\n’,于是我少了一次循环机会。我字符去数,刚好有5个回车,我也就少输入5次, )并推荐我输入字符串(%s)去试试。我去试试,可以按照我想要的存字符于数组中了。我又去提交了。
我不断的尝试,并输入值,答案也对啊?为什么呢?
后来才发现,当所需要的连续空座位K为1的时候,ans重复加了两次,所以当k=1时,结果要/2.
我修改后又去提交,终于:
总之这道题虐我不深,呜呜!