Description
Input
Output
5 ....# .#.@. .#@.. #.... ..... 4
-
Sample Input
16
-
Sample Output
HINT
对于50% 的数据,1<=n<=50,1<=m<= 5
• 对于100% 的数据,1<=n<=100,1<=m<=100
直接模拟没问题
#include <iostream>
#include <cstdio>
#define SIZE 101
using namespace std;
char a[SIZE][SIZE];
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
bool check(int x, int y) // 能否被传染?
{
int i;
for (i = 0; i < 4; ++i)
{
if (a[x+dx[i]][y+dy[i]] == '@') // 什么?周围有病源?
{
return true; // 感染
}
}
return false; // 幸存!
}
int main(void)
{
int n, m, i, j, res = 0;
scanf("%d", &n);
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
cin >> a[i][j];
}
}
scanf("%d", &m);
while (--m) // 输入的是第1天的情况,所以应该传染K-1次
{
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
if (a[i][j] == '.') // 确保是有人的房间
{
if (check(i, j)) // 能感染
{
a[i][j] = '%'; // 先暂时替换!
}
}
}
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
if (a[i][j] == '%') // 被替换的都换回病人了
{
a[i][j] = '@';
}
}
}
}
for (i = 1; i <= n; ++i) // 统计病人个数
{
for (j = 1; j <= n; ++j)
{
if (a[i][j] == '@')
{
++res;
}
}
}
printf("%d", res);
return 0;
}