熊猫烧香课程设计

/*烟台大学计算机与控制工程学院计171*/

设计题目:       熊猫烧香问题        

【问题描述】
一、课程设计题目

“熊猫烧香”是在网络中传播的一种著名病毒,因为图标是一只可爱的熊猫而得名。该病毒比较难以处理的一个原因是它有很多变种。

现在某实验室的网络就不幸感染了这种病毒。从图中可以看到,实验室的机器排列为一个M行N列的矩阵,每台机器只和它相邻的机器直接相连。开始时有T台机器被感染,每台遭遇的熊猫变种类型都不同,分别记为Type1, Type2?, Typet。每台机器都具有一定级别的防御能力,将防御级别记为L(0<L<1000)。“熊猫烧香”按照下列规则迅速在网络中传播:  

  1. 病毒只能从一台被感染的机器传到另一台没有被感染的机器。
  2. 如果一台机器已经被某个变种的病毒感染过,就不能再被其他变种感染。
  3. 病毒的传播能力每天都在增强。第1天,病毒只能感染它可以到达的、防御级别为1的机器,而防御级别大于1的机器可以阻止它从自己出继续传播。第D天,病毒可以感染它可以到达的、防御级别不超过D的机器,而只有防御级别大于D的机器可以组织它从自己出继续传播。
  4. 在同一天之内,Type1变种的病毒先开始传播,感染所有它可能感染的机器,然后是Type2变种、Type3变种……依次进行传播。

以下图为例说明传染的过程。

本题的任务是:当整个网络被感染后,计算有多少台机器被某个特定变种所感染。

熊猫烧香课程设计_第1张图片


输入由若干组测试数据组成。每组数据的第1行包含2个整数M和N(1≤M,N≤500),接下来是一个M×N的矩阵表示网络的初始感染状态,其中的正、负数的意义如题目描述中所定义。下面一行给出一个正整数Q,是将要查询的变种的个数。接下去的Q行里,每行给出一个变种的类型。当M或N为0时,表示全部测试结束,不要对该数据做任何处理。【输入要求】

【输出要求】

对每一组测试,在一行里输出被某个特定变种所感染的机器数量。

【样例】

输入:(如上图)

3 4

1 -3 -2 -3

-2 -1 -2 2

-3 -2 -1 -1

2

1

2

0 0

输出:

9

3  
三、算法设计 

(1)、保存电脑的坐标,所感染的病毒编号,以及防御等级和传播能力

struct computer

{

    int x;//横坐标

    int y;//纵坐标

    int virus;//病毒

    int grade;//等级

    friend bool operator < (computer n1,computer n2)//重载,病毒编号小的优先级高

    {

        return n1.virus>n2.virus;

    }

};  

computer com[510][510];//电脑分布图

computer virus_com;//病毒电脑

priority_queue q;

通过重载,更改了元素的优先级,病毒编号小的优先级更高,这样进入优先级队列的时候,就可以让病毒编号小的电脑先进行传播。

  1. 、进行广搜,搜索一台电脑的相邻的电脑,若正常电脑的防御等级小于病毒电脑的传播等级,则被感染,同时将这台刚被感染的电脑入队。

void bfs()

{

    int tx,ty;

    while(!q.empty())

    {

        virus_com=q.top();//将病毒编号小的电脑取出

        q.pop();

        for(int i=0;i<4;i++)//进行四个方向的搜索

        {

            tx=virus_com.x+next[i][0];

            ty=virus_com.y+next[i][1];

            if(tx<0||ty>=m||tx>=n||ty<0||com[tx][ty].virus>0)//如果越界或者是该电脑已经被感染了就不访问

                continue;

            if(com[tx][ty].grade<0&&abs(com[tx][ty].grade)<=virus_com.grade)//如果安全的电脑防御等级小于病毒的攻击等级

            {

                computer temp;

                com[tx][ty].virus=virus_com.virus;//更新电脑分布图上被感染电脑的病毒编号

                com[tx][ty].grade=virus_com.grade;//更新电脑分布图上被感染电脑的病毒等级

                temp.x=tx;//将感染后的电脑加入到队列中

                temp.y=ty;

                temp.grade=virus_com.grade;

                temp.virus=virus_com.virus;

                q.push(temp);

            }

        }

    }

}

(3)、每一天被感染的电脑的传播等级都会加强一个等级,该函数进行每日的更新

void init()//寻找已被感染过的电脑,更新病毒等级。

{

    int tx,ty;

    for(int i=0;i

    {

        for(int j=0;j

        {

            if(com[i][j].grade<0)//等级小于零,则为被感染,不需更新。

                continue;

            for(int k=0;k<4;k++)

            {

                tx=i+next[i][0];

                ty=j+next[i][1];

            }

            if(com[i][j].virus!=0)//如果第i行j列的电脑已被感染,则将他的病毒等级升级加一;

                com[i][j].grade++;

            if(com[i][j].virus>0)//如果第i行j列的电脑已被感染,再将其入队;

            {

                virus_com.grade=com[i][j].grade;

                virus_com.virus=com[i][j].virus;

                virus_com.x=i;

                virus_com.y=j;

                q.push(virus_com);

            }

        }

    }

}

代码:

#include
#include
#include
#include
using namespace std;
int n,m;
struct computer
{
    int x;//横坐标
    int y;//纵坐标
    int virus;//病毒
    int grade;//等级
    friend bool operator < (computer n1,computer n2)//重载,病毒编号小的优先级高
    {
        return n1.virus>n2.virus;
    }
};
int num;
int next[4][2]={{0,-1},{-1,0},{1,0},{0,1}};//左上右下
computer com[510][510];//电脑分布图
computer virus_com;//病毒电脑
priority_queue  q;
int safenum=0;
int viruscount[251000];
void bfs()
{
    int tx,ty;
    while(!q.empty())
    {
        virus_com=q.top();//将病毒编号小的电脑取出
        q.pop();
        for(int i=0;i<4;i++)//进行四个方向的搜索
        {
           // cout<<"virus num "<=m||tx>=n||ty<0||com[tx][ty].virus>0)//如果越界或者是该电脑已经被感染了就不访问
                continue;
            if(com[tx][ty].grade<0&&abs(com[tx][ty].grade)<=virus_com.grade)//如果安全的电脑防御等级小于病毒的攻击等级
            {
                computer temp;
                com[tx][ty].virus=virus_com.virus;//更新电脑分布图上被感染电脑的病毒编号
                com[tx][ty].grade=virus_com.grade;//更新电脑分布图上被感染电脑的病毒等级
                temp.x=tx;//将感染后的电脑加入到队列中
                temp.y=ty;
                temp.grade=virus_com.grade;
                temp.virus=virus_com.virus;
                q.push(temp);
            }
        }
    }
}
void init()//寻找已被感染过的电脑,更新病毒等级。
{
    int tx,ty;//,count1=0;
    for(int i=0;i=m||tx>=n||ty<0||com[i][j].virus>0)
//                    count1++;
            }
            if(com[i][j].virus!=0)//如果第i行j列的电脑已被感染,则将他的病毒等级升级加一;
                com[i][j].grade++;
            //cout<<"count1: "<0)//如果第i行j列的电脑已被感染,再将其入队;
            {
                virus_com.grade=com[i][j].grade;
                virus_com.virus=com[i][j].virus;
                virus_com.x=i;
                virus_com.y=j;
                q.push(virus_com);
            }
        }
    }
}
int main()
{
    while(cin>>n>>m)//输入行和列
    {
        while(!q.empty())//将队列清空,遇到的问题1
        {
            q.pop();
        }
        memset(com,0,sizeof(com));
        int maxgrade=999999999;
        for(int i=0;i>num;//输入计算机的防御等级
                if(num>0)//当等级大于零,则该计算机已经被感染
                {
                    virus_com.x=i;//记录已被感染的计算机的横坐标
                    virus_com.y=j;//记录已被感染的计算机的纵坐标
                    virus_com.virus=num;//记录已被感染的计算机的病毒编号
                    virus_com.grade=1;//记录已被感染的计算机的病毒的等级
                    com[i][j].virus=num;//
                    com[i][j].grade=1;
                    q.push(virus_com);//将已被感染的计算机入队
                }
                else
                {
                    com[i][j].virus=0;//初始化安全的计算机的病毒编号统一为0;
                    com[i][j].grade=num;//记录安全的计算机的防御等级;
                    maxgrade=min(maxgrade,num);
                }
            }
        }
//        for(int i=0;i>t;
        while(t--)
        {
            cout<<"请输入需要查询的病毒编号:"<>virusname;
            cout<<"感染"<

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

你可能感兴趣的:(课程设计)