NOI2.3.6262 流感传染题解(C++)

  • Post author:
  • Post category:其他




题目

总Time Limit: 1000ms Memory Limit: 65536kB

Description

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

Input

第一行一个数字n,n不超过100,表示有n*n的宿舍房间。

接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。

接下来的一行是一个整数m,m不超过100.

Output

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

Sample Input

5

…#

.#.@.

.#@…

#…



4

Sample Output

16



思路

在这一题里,有一个非常暴力而又明智的方法,就是一个个遍历,如果是已经感染流感的人就将四周的有人居住的人都传染了(标为@)然后就有了一个尴尬的事情,比如说下面这样:

@ . .
. . .
. . .

传染一次是这样:

@(传染过) @(未传染过) .
@(未传染过) . .
. . .

可是到下一个时又是’@‘符号,所以又传染了一次。因此造成Wrong Answer。

所以我们要把刚刚传染的标成另外一个字符’*’,扫一遍过去后再将’ *’变成‘@’就OK啦



代码

#include<bits/stdc++.h>
using namespace std;
char room[105][105];
int n,day,ans = 0;
void change(int x,int y){
	if(room[x-1][y] == '.'&&(x-1)>=0){
		room[x-1][y] = '*';
	}
	if(room[x][y-1] == '.'&&(y-1)>=0){
		room[x][y-1] = '*';
	}
	if(room[x+1][y] == '.'&&(x+1)<n){
		room[x+1][y] = '*';
	}
	if(room[x][y+1] == '.'&&(y+1)<n){
		room[x][y+1] = '*';
	}
}
int main(){
	cin>>n;
	getchar();
	for(int i = 0;i<n;i++){
		for(int j = 0;j<n;j++){
			char k = getchar();
			room[i][j] = k;
		}
		getchar();
	}
	cin>>day;
	
	for(int k = 1;k<day;k++){
		for(int i = 0;i<n;i++){
			for(int j = 0;j<n;j++){
				if(room[i][j] == '@'){
					change(i,j);
				}
			}
		}
		for(int i = 0;i<n;i++){
			for(int j = 0;j<n;j++){
				if(room[i][j] == '*'){
					room[i][j] = '@';
				}
			}
		}
	}
	for(int i = 0;i<n;i++){
		for(int j = 0;j<n;j++){
			if(room[i][j] == '@'){
				ans++;
			}
		}
	}
	cout<<ans;
}



版权声明:本文为jerry20183原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。