C语言每日一题——给学生安排连续座位

我信誓旦旦的去洛谷网站刷题,结果被一道题的细节坑蒙了。切听我细细道来。

我刚开始,上来的思路就是三步走,

第一步,根据题目,创建所需要变量,

第二步,将座位信息,存储到二维数组中

第三步,用两个嵌套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.

我修改后又去提交,终于:

总之这道题虐我不深,呜呜!

  • 11
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值