流感傳染 模擬

流感傳染

時間限制: 1 Sec 內存限制: 128 MB

題目描述

有一批易感人羣住在網格狀的宿舍區內,宿舍區爲n*n的矩陣,每個格點爲一個房間,房間裏可能住人,也可能空着。在第一天,有些房間裏的人得了流感,以後每天,得流感的人會使其鄰居傳染上流感,(已經得病的不變),空房間不會傳染。請輸出第m天得流感的人數。

輸入

第一行一個數字n,n不超過100,表示有n*n的宿舍房間。
接下來的n行,每行n個字符,’.’表示第一天該房間住着健康的人,’#’表示該房間空着,’@’表示第一天該房間住着得流感的人。
接下來的一行是一個整數m,m不超過100.

輸出
輸出第m天,得流感的人數

樣例輸入

5
…#
.#.@.
.#@…
#…

4

樣例輸出

16

解法:模擬

  • 我們直接模擬每一天即可,每次把新感染的人記爲其他符號,不要與已經得流感的人混淆,一天過後,再把符號改爲已經得流感的人
  • 考慮細節,第m天,指的是第m天新感染的不算,把符號轉換放在前面就可以避免這個問題,每次我們感染時,只能感染還沒有感染的人,不能感染已經感染的人,因爲這樣他就會被算作新感染的人,不能再感染其他人

AC代碼

#include<cstdio>
#define re register int
using namespace std;
int n,m,ans; char f[105][105];
const int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int main() {
	scanf("%d",&n);
	for(re i=1;i<=n;i++) {
		scanf("%s",f[i]+1);
	}
	scanf("%d",&m);
	while(m--) {
		for(re i=1;i<=n;i++) {
			for(re j=1;j<=n;j++) {
				if(f[i][j]=='!')
					f[i][j]='@';
			}
		}
		for(re i=1;i<=n;i++) {
			for(re j=1;j<=n;j++) {
				if(f[i][j]=='@') {
					for(re k=0;k<4;k++) {
						int nx=i+dx[k],ny=j+dy[k];
						if(f[nx][ny]=='.'&&nx>=1&&nx<=n&&ny>=1&&ny<=n) f[nx][ny]='!';
					}
				}
			}
		}
	}
	for(re i=1;i<=n;i++) {
		for(re j=1;j<=n;j++) {
			if(f[i][j]=='@') ans++;
		}
	}
	printf("%d",ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章