首页 > 病毒感染算法问题

病毒感染算法问题

一个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帮你写个算法

【热门文章】
【热门文章】