編程題#6:流感傳染
來源: POJ (Coursera聲明:在POJ上完成的習題將不會計入Coursera的最后成績。)
注意: 總時間限制: 1000ms 內存限制: 65536kB
描述
有一批易感人群住在網格狀的宿舍區內,宿舍區為n*n的矩陣,每個格點為一個房間,房間里可能住人,也可能空着。在第一天,有些房間里的人得了流感,以后每天,得流感的人會使其鄰居傳染上流感,(已經得病的不變),空房間不會傳染。請輸出第m天得流感的人數。
輸入
第一行一個數字n,n不超過100,表示有n*n的宿舍房間。
接下來的n行,每行n個字符,’.’表示第一天該房間住着健康的人,’#’表示該房間空着,’@’表示第一天該房間住着得流感的人。
接下來的一行是一個整數m,m不超過100.
輸出
輸出第m天,得流感的人數
樣例輸入
5 ....# .#.@. .#@.. #.... ..... 4
樣例輸出
16
思路:每天將標記的人感染,並標記第二天將要感染的人標記
1 #include<iostream> 2 #include<stdio.h> 3 using namespace std; 4 5 int main() 6 { 7 char a[101][101]; 8 int n, m, sum = 0; 9 cin >> n; 10 for(int i = 0;i < n; i++) 11 { 12 for(int j = 0; j < n; j++) 13 { 14 cin >> a[i][j]; 15 } 16 } 17 cin >> m; 18 for(int d = 1; d <= m; d++) 19 { 20 for(int i = 0; i < n; i++) 21 { 22 for(int j = 0; j < n;j++) 23 { 24 if(a[i][j] == '!') 25 a[i][j] = '@'; // 將前一天標記的人感染 26 } 27 } 28 for(int i = 0; i < n; i++) 29 { 30 for(int j = 0; j < n;j++) 31 {
33 // 將感染人周圍的人標記 32 if(a[i][j] == '@') 33 { 34 if(i + 1 <n && a[i + 1][j] == '.') 35 a[i + 1][j]='!'; 36 if(j - 1 >= 0 && a[i][j - 1] == '.') 37 a[i][j - 1] = '!'; 38 if(j + 1 < n && a[i][j + 1] == '.') 39 a[i][j + 1]='!'; 40 if(i - 1 >= 0 && a[i - 1][j] == '.') 41 a[i - 1][j] = '!'; 42 } 43 } 44 } 45 46 } 47 for(int i = 0; i < n; i++) 48 { 49 for(int j = 0; j < n; j++) 50 { 51 if(a[i][j] == '@') 52 sum++; 53 } 54 } 55 cout << sum << endl; 56 return 0; 57 }