使用稀疏矩阵和链表的冠状病毒模拟

问题描述 投票:0回答:1

我要编写一个程序,以模拟病毒在人体内的传播。这是描述和规格:

说明:

  • 模拟在一个矩阵r_1×c_1和一个容量为k的ICU列表中进行
  • 最初,人们将被随机放置在矩阵中
    • 对于COVID-19,是健康的,假面的或测试阳性的
    • 一开始会非常稀疏
  • 人们会不时地插入到常规矩阵中
    • 示例1:4 101 33 Alice Healthy
    • 示例2:5 101 34蒙面的鲍勃
    • 示例3:8 53 21 Xeno Sick
    • 示例4:8 101 32 John Sick

规格:

  • 戴面具的健康人将保持健康
  • 没有口罩的健康人将被正交相邻细胞中的病人感染。
    • 例如,在上一张幻灯片中提供的样本中,爱丽丝将在时间t = 8被约翰感染并在时间t = 9患病
  • 最初,所有病人的康复时间为14天。
  • 每个生病的邻居将使恢复时间增加7天。
    • 例如,在时间t = 9,爱丽丝的恢复时间是14 + 7(因为约翰在她旁边)。
    • 假设在时间t = 10,爱丽丝还有另一个生病的邻居,她的恢复时间将是(21-1)+7
  • 只有在以下情况下,患者才应移至重症监护病房:
    • 恢复时间超过28天
      • 例如,在时间T = 10,爱丽丝的恢复时间为27天,她将不会发送到ICU
      • 例如,在时间T = 11,爱丽丝有另一个生病的邻居,她的恢复时间变成(27-1)+7,她将在t = 11被送往ICU(如果ICU中还没有)
    • [ICU中确实有一些房间
    • 一旦人们搬到ICU,他/她将一直呆到最后
      • 例如,爱丽丝将成为幸存者,直到最后,但将永远留在重症监护病房。
  • [当生病的人被其他三个以上生病的人连续包围超过7天时,将会死亡。
    • 当一个人死亡时,牢房将变空并被阻塞。
  • 您的工作是打印:
    • 最后的幸存者比率
    • 幸存者的名字(不在ICU中的人)

我发现了类似的解决方案,并对其进行了调整以适应此问题,但我仍然感到困惑和迷失。

特别是,我不确定如何使用自动数据类型,也不确定是否有必要

#include<bits/stdc++.h>
using namespace std;

class patient{
    public:
    string name, state;
    bool inICU;
    int prow, pcol, recovery, death;
    patient(){}

    patient(string name, string state, int prow, int pcol){
        this->name = name;
        this->state = state;
        this->prow = prow;
        this->pcol = pcol;
        if(state=="Sick")
            this->recovery = 14;
        else this->recovery = 0;
        this->death = 7;
    }

};

int hospital_stat[500][500]; //0 for empty, 1 for occupied, 2 for blocked(dead)
patient hospital[500][500];
vector<patient> tarr[500];

void init_matrix(){
    for(int i=0;i<100;i++){
        for(int j=0;j<100;j++){
            hospital_stat[i][j] = 0;
        }
    }
}

void new_case(int t){
    for(auto i=tarr[t].begin();i!=tarr[t].end();i++){

        cout<<i->name<<endl;

        if(hospital_stat[i->prow][i->pcol]==0){
            hospital_stat[i->prow][i->pcol]=1;
            hospital[i->prow][i->pcol] = *i;
        }
        else
            {
            exit(1);
            }
    }
}
void check_up(){
    for(int i=0;i<500;i++){
        for(int j=0;j<500;j++){
            if(hospital_stat[i][j]==1 && hospital[i][j].state!="Masked" && hospital[i][j].inICU == false){
                int orth=0;

                if(i-1>=0 && j-1>=0 && hospital_stat[i-1][j-1]==1 && hospital[i-1][j-1].state=="Sick" && !hospital[i-1][j-1].inICU)
                    orth++;

                if(i+1<500 && j+1<500 && hospital_stat[i+1][j+1]==1 && hospital[i+1][j+1].state=="Sick" && !hospital[i+1][j+1].inICU)
                    orth++;

                if(i-1>=0 && j+1<500 && hospital_stat[i-1][j+1]==1 && hospital[i-1][j+1].state=="Sick" && !hospital[i-1][j+1].inICU)
                    orth++;

                if(i+1<500 && j-1>=0 && hospital_stat[i+1][j-1]==1 && hospital[i+1][j-1].state=="Sick" && !hospital[i+1][j-1].inICU)
                    orth++;

                if(i+1<0 && hospital_stat[i+1][j]==1 && hospital[i+1][j].state=="Sick" && !hospital[i+1][j].inICU)
                    orth++;

                if(i-1>=0 && hospital_stat[i-1][j]==1 && hospital[i-1][j].state=="Sick" && !hospital[i-1][j].inICU)
                    orth++;

                if(j-1>=0 && hospital_stat[i][j-1]==1 && hospital[i][j-1].state=="Sick" && !hospital[i][j-1].inICU)
                    orth++;

                if( j+1<500 && hospital_stat[i][j+1]==1 && hospital[i][j+1].state=="Sick" && !hospital[i][j+1].inICU)
                    orth++;

                if(hospital[i][j].recovery>28 && cap>0){
                    hospital[i][j].inICU = true;
                    cap--;
                }
                if(hospital[i][j].state=="Sick"){
                    hospital[i][j].recovery--;
                    if(hospital[i][j].recovery==0)
                        hospital[i][j].state="Healthy";
                }
                if(orth>1 && hospital[i][j].state!="Healthy"){
                    hospital[i][j].state="Sick";
                    hospital[i][j].recovery += (14+(orth*7));
                }
                if(orth>2)
                    hospital[i][j].death--;
                }
            }
        }
}
void simulate(int rows, int cols, int cap, int out_time){
    for(int t=0;t<=out_time;t++){
        check_up();
        new_case(t);
    }
}
int main()
{
    int rows, cols, cap, out_time, n, t, prow, pcol;

    string name, state;

    init_matrix();

    cin>>rows>>cols>>cap>>out_time>>n;

    while(n--){
        cin>>t>>prow>>pcol>>name>>state;
        patient p(name, state, prow, pcol);
        tarr[t].push_back(p);
    }
    simulate(rows,cols,cap,out_time);

    return 0;
}

我不知道哪里出了问题。

c++ linked-list sparse-matrix
1个回答
0
投票

您最好的选择是调试程序并逐步执行程序,以查看错误之处。从这里您将能够找出问题,如果仍然不能解决问题,则可以仅针对无法正常工作的部分发布问题,我们可以为您提供帮助

© www.soinside.com 2019 - 2024. All rights reserved.