類比‘熊貓燒香’過程

來源:互聯網
上載者:User

//Structs.h<br />#define MAXSIZE 500<br />int Vir_Nums=0;//記錄病毒總個數<br />int Defent_Max=0;//防禦等級最大值<br />//病毒<br />struct Virus<br />{<br />int row;//病毒所在行值<br />int col;//病毒所在列值<br />int type;//病毒類型在1-255之間<br />};<br />//區域網路<br />struct Defent//防禦等級或病毒類型<br />{<br />int data;<br />bool flag;//是否入過隊 true代表入過<br />};<br />struct NetWork<br />{<br />Defent data[MAXSIZE][MAXSIZE];<br />int M;//行數<br />int N;//列數<br />};<br />//病毒隊列<br />struct QueueVirus<br />{<br />Virus vir;<br />QueueVirus *next;<br />};<br />struct Queue//鏈隊列<br />{<br />QueueVirus *front,*rear;<br />};</p><p>NetWork net;<br />Virus virus[MAXSIZE];<br />Queue Q;//隊列指標</p><p>//cpp<br />#include<iostream.h><br />#include "Structs.h"<br />void QueueInit(Queue &Q)<br />{<br />QueueVirus *p=new QueueVirus;<br />p->next=NULL;<br />Q.front=p;<br />Q.rear=p;<br />}<br />void QueueIn(Queue &Q,Virus &v)<br />{<br />QueueVirus *temp=new QueueVirus;<br />temp->vir=v;<br />temp->next=NULL;<br />Q.rear->next=temp;<br />Q.rear=temp;<br />}<br />bool QueueEmpty(Queue &Q)<br />{<br />if(Q.front==Q.rear)<br />return true;<br />else<br />return false;<br />}<br />void QueueOut(Queue &Q,Virus &v)<br />{<br />if(!QueueEmpty(Q))<br />{<br />QueueVirus *temp;<br />temp=Q.front->next;<br />v=temp->vir;<br />Q.front->next=temp->next;<br />delete temp;<br />if(Q.front->next==NULL)<br />Q.rear=Q.front;<br />}<br />}<br />bool isExistQueue(Virus v)//用來判斷是否該元素已進入隊或進入過隊<br />{<br />QueueVirus *p=Q.front->next;<br />while(p)<br />{<br />if((p->vir.col==v.col)&&(p->vir.row==v.row))<br />return true;<br />else<br />p=p->next;<br />}<br />return false;<br />}<br />void getData()<br />{<br />cout<<"請輸入行數和列數"<<endl;<br />cin>>net.M>>net.N;<br />cout<<"請輸入初始感染狀況(即狀態矩陣)"<<endl;<br />for(int i=0;i<net.M;i++)<br />{<br />for(int j=0;j<net.N;j++)<br />{<br />cin>>net.data[i][j].data;<br />net.data[i][j].flag=false;<br />if(net.data[i][j].data>0)//若是病毒,就將其行列值記下並把類型記下<br />{<br />virus[Vir_Nums].type=net.data[i][j].data;<br />virus[Vir_Nums].row=i;<br />virus[Vir_Nums].col=j;<br />Vir_Nums++;<br />}<br />else<br />{<br />int temp=-net.data[i][j].data;<br />if(temp>Defent_Max)<br />Defent_Max=temp;<br />}<br />}<br />}<br />}<br />void showData()<br />{<br />for(int i=0;i<net.M;i++)<br />{<br />for(int j=0;j<net.N;j++)<br />cout<<net.data[i][j].data<<"/t";<br />cout<<endl<<endl;<br />}<br />}<br />int abs(int x)//對x去絕對值<br />{<br />if(x<0)<br />return -x;<br />else<br />return x;<br />}<br />void sortVirus()//對病毒類型進行排序<br />{<br />Virus temp;<br />for(int i=0;i<Vir_Nums;i++)<br /> {<br />for(int j=0;j<Vir_Nums-i;j++)<br />if(virus[j].type>virus[j+1].type)<br /> {<br />temp=virus[j];virus[j]=virus[j+1];virus[j+1]=temp;<br /> }<br /> }<br />}<br />void initState()//對區域網路狀態進行更新,把入過隊的改為沒有<br />{<br />for(int i=0;i<net.M;i++)<br />{<br />for(int j=0;j<net.N;j++)<br />net.data[i][j].flag=false;<br />}<br />}<br />void function()<br />{<br />Virus u;//暫存病毒對象的<br />QueueInit(Q);<br />sortVirus();<br />for(int day=1;day<=Defent_Max;day++)<br />{<br />for(int i=0;i<Vir_Nums;i++)<br />{<br />net.data[virus[i].row][virus[i].col].flag=true;<br />QueueIn(Q,virus[i]);//i病毒入隊列<br />u=virus[i];<br />while(!QueueEmpty(Q))<br />{<br />QueueOut(Q,u);//對頭元素出隊列共置為u<br />int i=u.row,j=u.col;//暫存行列值<br />if((i-1)>=0)//代表上面有值<br />if((net.data[i-1][j].data==u.type)&&(net.data[i-1][j].flag==false))<br />{<br />u.row=i-1;<br />u.col=j;<br />net.data[i-1][j].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />else<br />{<br />if((net.data[i-1][j].data<0)&&(abs(net.data[i-1][j].data)<=day)&&(net.data[i-1][j].flag==false))<br />{<br />net.data[i-1][j].data=u.type;<br />u.row=i-1;<br />u.col=j;<br />net.data[i-1][j].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />}<br />if((i+1)<net.M)//代表下面有值<br />if((net.data[i+1][j].data==u.type)&&(net.data[i+1][j].flag==false))<br />{<br />u.row=i+1;<br />u.col=j;<br />net.data[i+1][j].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />else<br />{<br />if((net.data[i+1][j].data<0)&&(abs(net.data[i+1][j].data)<=day)&&(net.data[i+1][j].flag==false))<br />{<br />net.data[i+1][j].data=u.type;<br />u.row=i+1;<br />u.col=j;<br />net.data[i+1][j].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />}<br />if((j+1)<net.N)//代表左面有值<br />if((net.data[i][j+1].data==u.type)&&(net.data[i][j+1].flag==false))<br />{<br />u.row=i;<br />u.col=j+1;<br />net.data[i][j+1].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />else<br />{<br />if((net.data[i][j+1].data<0)&&(abs(net.data[i][j+1].data)<=day)&&(net.data[i][j+1].flag==false))<br />{<br />net.data[i][j+1].data=u.type;<br />u.row=i;<br />u.col=j+1;<br />net.data[i][j+1].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />}<br />if((j-1)>=0)//代表右面有值<br />if((net.data[i][j-1].data==u.type)&&(net.data[i][j-1].flag==false))<br />{<br />u.row=i;<br />u.col=j-1;<br />net.data[i][j-1].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />else<br />{<br />if((net.data[i][j-1].data<0)&&(abs(net.data[i][j-1].data)<=day)&&(net.data[i][j-1].flag==false))<br />{<br />net.data[i][j-1].data=u.type;<br />u.row=i;<br />u.col=j-1;<br />net.data[i][j-1].flag=true;<br />if(!isExistQueue(u))<br />QueueIn(Q,u);<br />}<br />}<br />}<br />}<br />initState();<br />showData();<br />cout<<endl;<br />}<br />}<br />void CountVirus()<br />{//統計你要的種類病毒的個數<br />int Q,i,j,t;<br />int count;<br />int type1[MAXSIZE];<br />cout<<"輸入你想統計變種的個數:";<br />cin>>Q;<br />for(t=0;t<Q;t++)<br />{<br />count=0;<br />cout<<"輸入第"<<t+1<<"個變種:";<br />cin>>type1[t];<br />for(i=0;i<net.M;i++)<br />for(j=0;j<net.N;j++)<br />{<br />if(net.data[i][j].data==type1[t])<br />count++;<br />}<br />cout<<"第"<<t+1<<"變種個數為"<<count<<endl;<br />}<br />}<br />int main()<br />{<br />getData();<br />showData();<br />function();<br />showData();<br />CountVirus();<br />return 0;<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.