//Structs.h #define MAXSIZE 500 int Vir_Nums=0;//记录病毒总个数 int Defent_Max=0;//防御等级最大值 //病毒 struct Virus { int row;//病毒所在行值 int col;//病毒所在列值 int type;//病毒类型在1-255之间 }; //局域网 struct Defent//防御等级或病毒类型 { int data; bool flag;//是否入过队 true代表入过 }; struct NetWork { Defent data[MAXSIZE][MAXSIZE]; int M;//行数 int N;//列数 }; //病毒队列 struct QueueVirus { Virus vir; QueueVirus *next; }; struct Queue//链队列 { QueueVirus *front,*rear; }; NetWork net; Virus virus[MAXSIZE]; Queue Q;//队列指针 //cpp #include<iostream.h> #include "Structs.h" void QueueInit(Queue &Q) { QueueVirus *p=new QueueVirus; p->next=NULL; Q.front=p; Q.rear=p; } void QueueIn(Queue &Q,Virus &v) { QueueVirus *temp=new QueueVirus; temp->vir=v; temp->next=NULL; Q.rear->next=temp; Q.rear=temp; } bool QueueEmpty(Queue &Q) { if(Q.front==Q.rear) return true; else return false; } void QueueOut(Queue &Q,Virus &v) { if(!QueueEmpty(Q)) { QueueVirus *temp; temp=Q.front->next; v=temp->vir; Q.front->next=temp->next; delete temp; if(Q.front->next==NULL) Q.rear=Q.front; } } bool isExistQueue(Virus v)//用来判断是否该元素已进入队或进入过队 { QueueVirus *p=Q.front->next; while(p) { if((p->vir.col==v.col)&&(p->vir.row==v.row)) return true; else p=p->next; } return false; } void getData() { cout<<"请输入行数和列数"<<endl; cin>>net.M>>net.N; cout<<"请输入初始感染状况(即状态矩阵)"<<endl; for(int i=0;i<net.M;i++) { for(int j=0;j<net.N;j++) { cin>>net.data[i][j].data; net.data[i][j].flag=false; if(net.data[i][j].data>0)//若是病毒,就将其行列值记下并把类型记下 { virus[Vir_Nums].type=net.data[i][j].data; virus[Vir_Nums].row=i; virus[Vir_Nums].col=j; Vir_Nums++; } else { int temp=-net.data[i][j].data; if(temp>Defent_Max) Defent_Max=temp; } } } } void showData() { for(int i=0;i<net.M;i++) { for(int j=0;j<net.N;j++) cout<<net.data[i][j].data<<"/t"; cout<<endl<<endl; } } int abs(int x)//对x去绝对值 { if(x<0) return -x; else return x; } void sortVirus()//对病毒类型进行排序 { Virus temp; for(int i=0;i<Vir_Nums;i++) { for(int j=0;j<Vir_Nums-i;j++) if(virus[j].type>virus[j+1].type) { temp=virus[j];virus[j]=virus[j+1];virus[j+1]=temp; } } } void initState()//对局域网状态进行更新,把入过队的改为没有 { for(int i=0;i<net.M;i++) { for(int j=0;j<net.N;j++) net.data[i][j].flag=false; } } void function() { Virus u;//暂存病毒对象的 QueueInit(Q); sortVirus(); for(int day=1;day<=Defent_Max;day++) { for(int i=0;i<Vir_Nums;i++) { net.data[virus[i].row][virus[i].col].flag=true; QueueIn(Q,virus[i]);//i病毒入队列 u=virus[i]; while(!QueueEmpty(Q)) { QueueOut(Q,u);//对头元素出队列并置为u int i=u.row,j=u.col;//暂存行列值 if((i-1)>=0)//代表上面有值 if((net.data[i-1][j].data==u.type)&&(net.data[i-1][j].flag==false)) { u.row=i-1; u.col=j; net.data[i-1][j].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } else { if((net.data[i-1][j].data<0)&&(abs(net.data[i-1][j].data)<=day)&&(net.data[i-1][j].flag==false)) { net.data[i-1][j].data=u.type; u.row=i-1; u.col=j; net.data[i-1][j].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } } if((i+1)<net.M)//代表下面有值 if((net.data[i+1][j].data==u.type)&&(net.data[i+1][j].flag==false)) { u.row=i+1; u.col=j; net.data[i+1][j].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } else { if((net.data[i+1][j].data<0)&&(abs(net.data[i+1][j].data)<=day)&&(net.data[i+1][j].flag==false)) { net.data[i+1][j].data=u.type; u.row=i+1; u.col=j; net.data[i+1][j].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } } if((j+1)<net.N)//代表左面有值 if((net.data[i][j+1].data==u.type)&&(net.data[i][j+1].flag==false)) { u.row=i; u.col=j+1; net.data[i][j+1].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } else { if((net.data[i][j+1].data<0)&&(abs(net.data[i][j+1].data)<=day)&&(net.data[i][j+1].flag==false)) { net.data[i][j+1].data=u.type; u.row=i; u.col=j+1; net.data[i][j+1].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } } if((j-1)>=0)//代表右面有值 if((net.data[i][j-1].data==u.type)&&(net.data[i][j-1].flag==false)) { u.row=i; u.col=j-1; net.data[i][j-1].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } else { if((net.data[i][j-1].data<0)&&(abs(net.data[i][j-1].data)<=day)&&(net.data[i][j-1].flag==false)) { net.data[i][j-1].data=u.type; u.row=i; u.col=j-1; net.data[i][j-1].flag=true; if(!isExistQueue(u)) QueueIn(Q,u); } } } } initState(); showData(); cout<<endl; } } void CountVirus() {//统计你要的种类病毒的个数 int Q,i,j,t; int count; int type1[MAXSIZE]; cout<<"输入你想统计变种的个数:"; cin>>Q; for(t=0;t<Q;t++) { count=0; cout<<"输入第"<<t+1<<"个变种:"; cin>>type1[t]; for(i=0;i<net.M;i++) for(j=0;j<net.N;j++) { if(net.data[i][j].data==type1[t]) count++; } cout<<"第"<<t+1<<"变种个数为"<<count<<endl; } } int main() { getData(); showData(); function(); showData(); CountVirus(); return 0; }