2013北大《计算概论A》期中试题
【描述】
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
【输入】
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,‘.’表示第一天该房间住着健康的人,‘#’表示该房间空着,‘@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100。
【输出】
输出第m天得流感的人数。
【输入示例】
5
....#
.#.@.
.#@..
#....
.....
4
【输出示例】
16
【C代码】
---------------
#include<stdio.h>
#defineARRAY_SIZE 100
intmain(void) {
char a[ARRAY_SIZE][ARRAY_SIZE];
int i, j, k, m, n, sum;
scanf("%d", &n);
getchar(); /*跳过换行符 */
for(i = 0; i < n; ++i) {
for(j = 0; j < n; ++j)
scanf("%c", &a[i][j]);
getchar(); /*跳过换行符 */
}
scanf("%d", &m);
for(k = 2; k <= m; ++k) {
for(i = 0; i < n; ++i) {
for(j = 0; j < n; ++j) {
if(a[i][j] == '@') {
/*左边住着健康的人,置为一个临时标志 */
if(i - 1 >= 0 && a[i - 1][j] =='.')
a[i - 1][j] = '*';
/*右边住着健康的人 */
if(i + 1 < n && a[i + 1][j] == '.')
a[i + 1][j] = '*';
/*上边住着健康的人 */
if(j - 1 >= 0 && a[i][j - 1] =='.')
a[i][j - 1] = '*';
/*下边住着健康的人 */
if(j + 1 < n && a[i][j + 1] == '.')
a[i][j + 1] = '*';
}
}
}
/*将临时标志替换成感染标志 */
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
if(a[i][j] == '*')
a[i][j] = '@';
}
sum = 0;
for(i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
if(a[i][j] == '@')
++sum;
printf("%d\n",sum);
return 0;
}