7-1 感染人数

设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上流感,请问:第m天总共有多少人得流感?

输入格式:

第一行输入两个整数n,m(1<n≤20,1≤m≤100),含义如上述;接着输入n行,每行n个字符,表示住宿区域第一天的房间情况,其中,@表示当天该房间住着得流感的人,.表示该房间住着健康的人,#表示该房间是空的。

输出格式:

输出一个整数,表示第m天得了流感的人数。

输入样例1:

5 3
#....
.....
...##
.#.@.
@.#..

输出样例1:

10

输入样例2:

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

输出样例2:

16

思路讲解:

由题可知,得了流感的人会传染他上下左右房间中的人,最后要求求出第m天的感染人数。我们使用一个二维数组代表该宿舍区域,其中每个元素代表一间房间。

首先,读入了两个整数n和m,表示区域的大小和要模拟的天数。然后使用一个二维字符数组a来表示初始的房间情况,temp数组用来存储下一天的情况。cnt变量用来统计得了流感的人数。

接下来,通过两个嵌套的for循环,模拟了每一天的传染过程。在每一天的传染过程中,遍历所有的房间,如果当前房间里有得了流感的人,就会传染给周围的健康人(前提是有人)。然后通过temp数组更新下一天的房间情况。

经过m天的传染过程后,程序再次遍历房间,统计得了流感的人数,并输出结果。

注意点:其中题目要求的是第m天的感染人数,所以天数的循环应为for(int k=1;k<m;k++);

当感染其他房间的人时,先要判断该房间是否有人,同时还要保证房间是否到达边界。

if(a[i][j]=='@'){
					if(j>0&&a[i][j-1]=='.') temp[i][j-1]='@';
					if(j<n-1&&a[i][j+1]=='.') temp[i][j+1]='@';
					if(i>0&&a[i-1][j]=='.') temp[i-1][j]='@';
					if(i<n-1&&a[i+1][j]=='.') temp[i+1][j]='@';
				}

 还有应用temp先来储存感染后的情况,要是使用一个数组来保存会出现第一次还未被感染的人也会开始感染其他人。比如:一个人a感染他的右边房间健康的人b,本来在这一轮是还没轮到b感染其他人,若直接用一个数组,则b在这一轮也会开始感染其他人。

完整代码:

#include <stdio.h>

int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	getchar();
	char a[20][20];
	char temp[20][20];
	int cnt=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			scanf("%c",&a[i][j]);
		}
		getchar();
	}
	for(int k=1;k<m;k++){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				temp[i][j]=a[i][j];
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(a[i][j]=='@'){
					if(j>0&&a[i][j-1]=='.') temp[i][j-1]='@';
					if(j<n-1&&a[i][j+1]=='.') temp[i][j+1]='@';
					if(i>0&&a[i-1][j]=='.') temp[i-1][j]='@';
					if(i<n-1&&a[i+1][j]=='.') temp[i+1][j]='@';
				}
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				a[i][j]=temp[i][j];
			}
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(a[i][j]=='@') cnt++;
		}
	}
	
	printf("%d",cnt);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值