#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Maxsize 1000
typedef struct VertexType
{
int r;//行号
int c;//列号
int day;//感染日期
int df;//计算机的防御等级
int vt;//病毒的类型
}VertexType;
typedef struct MGraph
{
VertexType m[Maxsize][Maxsize];
int row,col;
int num;
}MGraph;
MGraph mg;
void MGraphInit()
{
int i,j;
for(i=0;i<mg.row;i++)
{
for(j=0;j<mg.col;j++)
{
mg.m[i][j].vt=0;
mg.m[i][j].df=0;
mg.m[i][j].day=0;
mg.num=0;
mg.m[i][j].r=i;
mg.m[i][j].c=j;
}
}
}
void MGraphCreat()
{
MGraphInit();
printf("请按行输入\n");
int i,j;
for(i<0;i<mg.row;i++)
{
printf("请输入第%d行:",i+1);
for(j=0;j<mg.col;j++)
{
int a;
scanf("%d",&a);
if(a>0)
{
mg.m[i][j].vt=a;
}
else{
mg.m[i][j].df=0-a;
}
}
}
}
void virspread(VertexType v,int _nowday)
{
VertexType qv[4*Maxsize];
int front=0,rear=1;
qv[1]=v;
while(front<=rear)
{
v=qv[++front];
if(v.r-1>=0&&mg.m[v.r-1][v.c].vt==0&&mg.m[v.r-1][v.c].df<=_nowday)
{
mg.m[v.r-1][v.c].vt=v.vt;
qv[++rear]=mg.m[v.r-1][v.c];
}
if(v.r+1<mg.row&&mg.m[v.r+1][v.c].vt==0&&mg.m[v.r+1][v.c].df<=_nowday)
{
mg.m[v.r+1][v.c].vt=v.vt;
qv[++rear]=mg.m[v.r+1][v.c];
}
if(v.c+1>=0&&mg.m[v.r][v.c+1].vt==0&&mg.m[v.r][v.c+1].df<=_nowday)
{
mg.m[v.r][v.c+1].vt=v.vt;
qv[++rear]=mg.m[v.r][v.c+1];
}
if(v.c-1>=0&&mg.m[v.r][v.c-1].vt==0&&mg.m[v.r][v.c-1].df<=_nowday
){
mg.m[v.r][v.c-1].vt=v.vt;
qv[++rear]=mg.m[v.r][v.c-1];
}
}
}
void vir()
{
int virtype=1;
int i,j;
int nowday=1;
int num=0;
while(num<(mg.row*mg.col))
{
num=0;
while(virtype<=Maxsize)
{
for(i=0;i<mg.row;i++)
for(j=0;j<mg.col;j++)
{
if(mg.m[i][j].vt==virtype)
{
virspread(mg.m[i][j],nowday);
}
}
virtype++;
}
printf("第%d天的传染状态为:\n",nowday);
for(i=0;i<mg.row;i++)
{
for(j=0;j<mg.col;j++)
{
if(mg.m[i][j].vt>0)
{
printf(" %d ",mg.m[i][j].vt);
num++;
}
else printf(" %d ",0-mg.m[i][j].df);
}
printf("\n");
}
nowday++;
virtype=1;
}
}
int virCount(){
int num=0;
int i,j,k,ct[Maxsize];
for(int m=1;m<Maxsize;m++){
ct[m]=0;
}
for(i=0;i<mg.row;i++)
{
for(j=0;j<mg.col;j++)
{
ct[mg.m[i][j].vt]++;
}
}
printf("感染完后病毒变种的数目:\n");
printf("\n");
for(k=1;k<Maxsize;k++)
{
if(ct[k]!=0)
{
printf("变种类型为:%d的变种数目是:%d\n",k,ct[k]);
}
}
return 0;
}
int main()
{
int i,j;
int num=0;
int flag=1;
printf("****欢迎进入熊猫烧香病毒感染统计程序****\n");
int count=1;
while(flag)
{
printf("***************\n");
printf("第%d次实验\n",count);
printf("***************\n");
printf("请输入行列数目(行列数必须为正整数!)\n");
printf("输入行数:");
scanf("%d",&mg.row);
if(mg.row<0)
{
printf("行数必须为正整数!请重新测试\n");
}
else printf("输入列数:");
scanf("%d",&mg.col);
if(mg.col<0)
{
printf("列数必须为正整数!请重新测试\n");
}
else
{
MGraphCreat();
printf("请确定你的输入:\n");
for(i=0;i<mg.row;i++)
{
for(j=0;j<mg.col;j++)
{
if(mg.m[i][j].vt!=0)
printf("%d ",mg.m[i][j].vt);
else
printf("%d ",0-mg.m[i][j].df);
}
printf("\n");
}
printf("\n");
}
for(i=0;i<mg.row;i++)
{
for(j=0;j<mg.col;j++)
{
if(mg.m[i][j].vt>0)
num++;
}
}
if(num=0)
{
printf("网络安全,无病毒!!\n");
}
else
{
vir();
virCount();
}
count++;
}
return 0;
}