流感傳染
時間限制: 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;
}