题目
思路
模拟题。需要注意的是“感染者被治疗”“感染加重”和“感染周围的人”三段代码的先后顺序:
“感染时间忽略不计”体现在“感染周围的人”代码段在“感染者病情加重”之后,且由于感染周围的人”代码段会影响周边的元素,因此要单独开一个循环,不能放在“感染者病情加重”循环里
“1个单位时间以后才变成0”体现在“感染者被治疗”代码段在“感染者病情加重”之前
代码
#include<cstdio>
const int NMAX = 15;
int n, m;
int mat[NMAX][NMAX] = {};
//void myprint()
//{
// int i, j;
// for (i=1; i<=n; i++)
// {
// for (j=1; j<=m; j++)
// {
// printf("%d ", mat[i][j]);
// }
// printf("\n");
// }
// printf("\n");
//}
int main()
{
#ifndef ONLINE_JUDGE
freopen("thuSE15_01.txt", "r", stdin);
#endif
int k, i, j, x, y, cnt, maxv = 0;
scanf ("%d%d%d", &n, &m, &k);
for (i=0; i<k; i++)
{
scanf ("%d%d", &x, &y);
mat[x][y] = 1;
}
while (1)
{
cnt = 0;
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
if (mat[i][j] > 0)
{
cnt++;
}
}
}
//printf("%d\n", cnt);
//myprint();
maxv = maxv>cnt? maxv:cnt;
if (cnt == 0)
{
break;
}
for (i=1; i<=n; i++)
{
for (j=1; j<=m; j++)
{
// 感染者被治疗(“1个单位时间以后才变成0”体现在“感染者被治疗”代码段在“感染者病情加重”之前)
if (mat[i][j] == 5)
{
mat[i][j] = -1; // -1表示不会再被感染
}
// 感染者病情加重
if (mat[i][j] > 0 && mat[i][j] < 5)
{
mat[i][j] ++;
}
}
}
// 感染周围的人(“感染时间忽略不计”体现在“感染周围的人”代码段在“感染者病情加重”之后)
// 由于会影响周边的元素,因此要单独开一个循环,不能放在上一个循环里
for (i=1; i<=m; i++)
{
for (j=1; j<=n; j++)
{
if (mat[i][j] == 4)
{
if (mat[i-1][j] == 0)
{
mat[i-1][j] = 1;
}
if (mat[i][j-1] == 0)
{
mat[i][j-1] = 1;
}
if (mat[i][j+1] == 0)
{
mat[i][j+1] = 1;
}
if (mat[i+1][j] == 0)
{
mat[i+1][j] = 1;
}
}
}
}
}
printf("%d", maxv);
return 0;
}