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天内总共感染的人数,第一天是给出的感染人数,所以循环天数要减1次。
- 因为所求天数m天内都会有新的人被感染,所以要将新感染的人和前一天/初始被感染的人区分开。所以给新感染人设置一个不同的符号(例如:‘1’或者其他都可以)。同时循环到当前房间时,它左边那一个和上面那一个当天已经遍历过了,就可以直接设置为‘@’,而右边和下面没有,先设置为‘1’,然后多加一个判断是不是‘1’,是就将其改为‘@’;或者把上下左右都改成‘1’,最后一起改成‘@’。
- 最后循环整个数组,计算出‘@’的个数就是感染的总人数
通过的代码:
#include<iostream> using namespace std; int main(){ int n,m; cin>>n>>m; char a[n][n]; cin.get(); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ a[i][j]=cin.get(); } cin.get(); } for(int k=1;k<m;k++){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(a[i][j]=='@'){ if(i>0&&a[i-1][j]=='.') a[i-1][j]='@'; if(i<n-1&&a[i+1][j]=='.') a[i+1][j]='1'; if(j>0&&a[i][j-1]=='.') a[i][j-1]='@'; if(j<n-1&&a[i][j+1]=='.') a[i][j+1]='1'; } if(a[i][j]=='1'){ a[i][j]='@'; } } } } int count=0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(a[i][j]=='@') count++; } } cout<<count<<endl; }标签:样例,房间,感染,PTA,输入,人数,流感 From: https://www.cnblogs.com/qq286442936/p/17863142.html