不爱学习的小W HNUST 1881(数组开小点的灵活运用)

“叮铃铃”上课了,同学们都及时到了教室坐到了座位上,教室里有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);
 
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值