2015年清华软院保研机试第1题:病毒感染

题目

思路

模拟题。需要注意的是“感染者被治疗”“感染加重”和“感染周围的人”三段代码的先后顺序:

“感染时间忽略不计”体现在“感染周围的人”代码段在“感染者病情加重”之后,且由于感染周围的人”代码段会影响周边的元素,因此要单独开一个循环,不能放在“感染者病情加重”循环里

“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;
}

猜你喜欢

转载自blog.csdn.net/da_kao_la/article/details/82428570