一个n*m的区域内,有k个初试感染患者,患者的初始感染状态为1,未感染的正常人的状态为0。每过一个单位时间,患者的感染状态加一,当感染状态为4时,这个患者具备感染他人的能力(感染时间忽略不计),感染的对象为他上下左右的人,已经被感染的人不可再次被感染;当感染状态为5时,病人开始接受治疗,到下一时刻开始感染状态变成0,并且具备抗体,不会再被感染。请问在整个过程中同时处于感染状态的人最多有多少人?
输入钱两个数字为n和m,第三个数字为k,接下来两个数为一组,k组输入分别为初始感染者的位置。其中0 < n < 10, 0 < m < 10, 0 < k < n*m。
输出为同时感染最多的人数
样例输入:
3 3 1 2 2
样例输出:
8
其中同时感染的人数变化是1 1 1 5 5 4 8 8 4 4 4 0 0…
不就是简单的元胞自动机模型?
不用谢,已经通过的C++代码:
include <iostream>
include <fstream>
include <memory.h>
using namespace std;
int main()
{
int n, m, k, i, j;
//ifstream cin("test.txt");
while (cin>>n>>m)
{
cin >> k;
int max = k;
int x = 0, y = 0, time = 1;
int area[12][12];
memset(area, 0, sizeof(area));
for (i = 0;i < k; i++)
{
cin >> x >> y;
area[x][y] = 1;
}
while(time++)
{
int num = 0;
for (i = 1;i <= n;i++)
{
for (j = 1;j <= m;j++)
{
//为6永远不会感染别人
if (area[i][j] >=1 && area[i][j] <=5)
area[i][j]++; //我靠,程序半天没调出来,这句写成了area[x][y]++; fuck!!!
if (area[i][j] == 4)
{
if (area[i - 1][j] == 0) area[i - 1][j] = 1;
if (area[i + 1][j] == 0) area[i + 1][j] = 1;
if (area[i][j + 1] == 0) area[i][j + 1] = 1;
if (area[i][j - 1] == 0) area[i][j - 1] = 1;
}
}
}
for (i = 1;i <= n; i++)
{
for (j = 1;j <= m;j++)
{
if (area[i][j] >= 1 && area[i][j] <= 5)
num++;
}
}
if (num > max) max = num;
if (num < k) break;
}
cout << max << endl;
}
return 0;
}
如果有付费意愿可以加我Q343275968帮你写个算法