问题 B: 不爱学习的小W
时间限制: 2 Sec 内存限制: 64 MB提交: 1074 解决: 48
[ 提交][ 状态][ 讨论版]
题目描述
“叮铃铃”上课了,同学们都及时到了教室坐到了座位上,教室里有n行m列的座位而且刚好坐满。既然是上课,那老师叫学生回答问题就是再正常不过的事了,同样地,教室里也就有爱学习和不爱学习的学生了,爱学习的学生对老师提的问题都知道,而不爱学习的学生却恰好相反,对老师提的问题都不知道。爱学习的同学对别人的求助都会热情地伸以援手。
小W也在这个教室上课,但是这个时候小W却很紧张,为什么呢,因为小W就是个不爱学习的学生,对老师提的问题一个都不知道,而且这个任课老师每节课上都点名,且每次点名都是随机的。本来如果点到他他也会想尽办法求助前后左右直接相邻的同学(远了就无能为力了啊),问题就是,他前后左右都是不爱学习的同学, 所以这个时候他特别地紧张,担心下一个点到的就是自己。
同样,其他不爱学习的同学如果被点到也只能求助前后左右直接相邻的同学,要是相邻同学都不爱学习,那也会和小W一样紧张了。当然爱学习的同学肯定就不紧张啦。所以小W想知道,这节课有多少个和自己一样也在紧张的同学(当然小W自己也在紧张咯)。
输入
输入包括多组数据(组数不超过50)。每组数据格式如下:
每行一个n,m,1 <= n <= 10000, 1 <= m<=10000,n * m <= 1000000。
接着是n行m列个数,只包含0和1,0代表该位置的学生不爱学习,1代表该位置的学生爱学习。
输出
对于每组数据,输出一个数,代表这节课上紧张的学生人数,保证答案大于零。
样例输入
2 30 0 00 0 03 41 0 1 10 0 0 11 0 1 1
样例输出
61
提示
这道题真的坑,刚开始没看标程,一直运行错误,还在纳闷怎么一会事,后来才发现内存超了,把二维改成一维数组,在一些边界问题上一直没处理好,WA了4次,最后才发现是一个等于号的错误。现场写的代码,有点丑,这改改那改改的
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
using namespace std;
int data[1000100];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int k=0;
int ans=0;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
{
scanf("%d",&data[k++]);
}
for(int i=0; i<n*m; i++)
{
int x=i-m,y=i+m,z=i+1,q=i-1;
if(i%m==m-1)
z=i;
if(i%m==0)
{
q=i;
}
if(x<0|| x>=n*m) x=i;
if(y<0|| y>=n*m) y=i;
if(z<0|| z>=n*m) z=i;
if(q<0|| q>=n*m) q=i; //这四个>=n*m 的等于号,一直没搞明白,按道理来说没有等于号也是可以的,知道的小伙伴评论一下
if(data[x]==0 && data[y]==0 && data[z]==0 && data[q]==0 && data[i]==0)
ans++;
}
printf("%d\n",ans);
}
return 0;
}