POJ C程序设计进阶 编程题#6:流感传染
编程题#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 }