不爱学习的小W HNUST 1881(数组开小点的灵活运用)
2017-12-18 20:26
288 查看
“叮铃铃”上课了,同学们都及时到了教室坐到了座位上,教室里有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 3
0 0 0
0 0 0
3 4
1 0 1 1
0 0 0 1
1 0 1 1
样例输出
6
1
思路:照着题目模拟,只不过这道题是卡内存的,所以直接用二维数组会超限。
1)不定长数组
2)输入m,n之后再定义。
3)一维数组,然后通过在一维数组中的顺序得到行列所在的位置
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <string>
using namespace std;
typedef long long ll;
int a[1000005];
int sum=0,n,m;
int dis[4][2]= {0,-1,0,1,1,0,-1,0};
int judge(int i,int j)
{
if(i<1||j<1||i>n||j>m) return 0;
return 1;
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
int sum=0,cnt=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d",&a[cnt++]);
// printf("%d\n",cnt-1);
for(int ipos=0;ipos<cnt;ipos++)
{
int i=ipos/m+1,j=ipos%m+1;
if(a[ipos]==1)
{
int col,pok;
for(int hang=0; hang<4; hang++)
{
col=i+dis[hang][0],pok=j+dis[hang][1];
if(judge(col,pok))
{
int k=(col-1)*m+pok-1;
if(a[k]!=1)
a[k]=-1;
}
}
}
}
for(int ipos=0;ipos<cnt;ipos++)
{
if(a[ipos]==1||a[ipos]==-1)
sum++;
}
printf("%d\n",n*m-sum);
}
}
小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 3
0 0 0
0 0 0
3 4
1 0 1 1
0 0 0 1
1 0 1 1
样例输出
6
1
思路:照着题目模拟,只不过这道题是卡内存的,所以直接用二维数组会超限。
1)不定长数组
2)输入m,n之后再定义。
3)一维数组,然后通过在一维数组中的顺序得到行列所在的位置
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <string>
using namespace std;
typedef long long ll;
int a[1000005];
int sum=0,n,m;
int dis[4][2]= {0,-1,0,1,1,0,-1,0};
int judge(int i,int j)
{
if(i<1||j<1||i>n||j>m) return 0;
return 1;
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
int sum=0,cnt=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d",&a[cnt++]);
// printf("%d\n",cnt-1);
for(int ipos=0;ipos<cnt;ipos++)
{
int i=ipos/m+1,j=ipos%m+1;
if(a[ipos]==1)
{
int col,pok;
for(int hang=0; hang<4; hang++)
{
col=i+dis[hang][0],pok=j+dis[hang][1];
if(judge(col,pok))
{
int k=(col-1)*m+pok-1;
if(a[k]!=1)
a[k]=-1;
}
}
}
}
for(int ipos=0;ipos<cnt;ipos++)
{
if(a[ipos]==1||a[ipos]==-1)
sum++;
}
printf("%d\n",n*m-sum);
}
}
相关文章推荐
- 不爱学习的小W HNUST 1881(数组开小点的灵活运用)
- 不爱学习的小W HNUST 1881(数组开小点的灵活运用)
- 不爱学习的小W HNUST 1881(数组开小点的灵活运用)
- 不爱学习的小W HNUST 1881(数组开小点的灵活运用)
- 不爱学习的小W HNUST 1881(数组开小点的灵活运用)
- 不爱学习的小W HNUST 1881(数组开小点的灵活运用)
- 不爱学习的小W HNUST 1881(数组开小点的灵活运用)
- 学习笔记之灵活运用数组下标
- 变长数组的灵活运用
- 对象调用数组运用 学习很吃力
- 在项目中灵活运用合适的排序方法(Sphinx,SQL,Yii,数组)
- 【学习ios之路:C语言】数组.循环.语句总和运用试题练习
- Scala学习之循环和数组的运用
- 关于大脑的一些常识,学习中请注意灵活运用
- 如何灵活运用PHP判断字符串的包含 PHP数组包含
- 黑马程序员--学习笔记--一个字符串、数组、函数综合运用的小练习
- NYOJ 228 士兵杀敌(五)(数组灵活运用)
- 资金互助社业务学习园地(一) 灵活运用通知储蓄存款
- poj2155 二维树状数组 二位线段树 灵活运用 待补完
- c语言 第一讲 字符串数组函数调用--const的灵活运用