NOI / 2.3基本算法之递归变递推 6262:流感传染

描述

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

输入

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.

输出

输出第m天,得流感的人数

样例输入

5
....#
.#.@.
.#@..
#....
.....
4

样例输出

16
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int b[105][105]={0},i,j,k,n,m,t=0;//b数组是用来存a数组值的(t要给初值)
    char a[105][105]={0};//a数组是char类型
    cin>>n;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            cin>>a[i][j];
    cin>>m;
    for(k=2;k<=m;k++)
    {
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(a[i][j]=='@')
                {
                    if(a[i-1][j]=='.')
                        b[i-1][j]=1;
                    if(a[i+1][j]=='.')
                        b[i+1][j]=1;
                    if(a[i][j-1]=='.')
                        b[i][j-1]=1;
                    if(a[i][j+1]=='.')
                        b[i][j+1]=1;
                }
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(b[i][j]==1)a[i][j]='@';
        memset(b,0,sizeof(b));//把b数组归0(可以不加)
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(a[i][j]=='@')
                t++;
    cout<<t<<endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define N 105
int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int main()
{
    char mp[N][N], t[N][N];//t:临时数组 
	int n, m, ct = 0;
	cin >> n;
	for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            cin >> mp[i][j];
    cin >> m;
    for(int k = 2; k <= m; ++k)//第k天如何传染 
    {
        memset(t, 0, sizeof(t));//对t清空。 
        for(int i = 1; i <= n; ++i)
            for(int j = 1; j <= n; ++j)
            {
                t[i][j] = mp[i][j];
                if(mp[i][j] == '.')//如果(i,j)没患病,但周围有病人,就会被传染,否则和原来一样。 
                {
                    for(int l = 0; l < 4; ++l)
                    {
                        int x = i + dir[l][0], y = j + dir[l][1];
                        if(x >= 1 && x <= n && y >= 1 && y <= n && mp[x][y] == '@') 
                            t[i][j] = '@';
                    }
                }
            }
        memcpy(mp, t, sizeof(t));//拷贝t到mp 
    }
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            if(mp[i][j] == '@')
                ct++;
    cout << ct; 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值