1191:流感傳染


題目鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1191

此題做題思路:這個題考查模擬矩陣的搜索過程。用字符二維數組存放網格狀的宿舍區,用

int next[4][4]={{0,1},{1,0},{-1,0},{0,-1}};

來模擬感染四個方向。於是大概5m后出現如下代碼:

#include<iostream>
using namespace std;
char a[101][101];
int n, m, cnt=0;
int next[4][4]={{0,1},{1,0},{-1,0},{0,-1}};//四個方向感染 void gr(int x, int y)//該函數為感染函數
{
    int dx, dy;
    for(int i=0; i<4; i++)//依次對上下左右進行判斷
    {
        dx=x+next[i][0];
        dy=y+next[i][1];
        if(dx>0 && dx<=n && dy>0 && dy<=n && a[dx][dy]=='.')//如果沒有越界,並且當前住着沒有被感染的病人
        {
            a[dx][dy]='@';//符合上述條件感染
            cnt++;//感染數加1
        }        
    }
}
int main()
{
    cin>>n;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
        {
            cin>>a[i][j];
        }        
    cin>>m;
    for(int k=2; k<=m; k++)
    {
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                if(a[i][j]=='@')gr(i,j);//如果當前為@調用gr()函數
            }
                
    }            
    cout<<cnt<<endl;
    return 0;
}

結果運行如下:

樣例顯然不對,發生了什么事情?為了查出錯誤在什么地方,在第37行之后增加如下代碼

1     for(int i=1; i<=n; i++)
2     {
3         for(int j=1; j<=n; j++)
4                 cout<<a[i][j]<<" ";
5                 cout<<endl;
6     }

並且輸入m=2表示觀察一下經過第二天感染后病毒人數是多少,發現感染數顯然不對,原因是使用雙重循環遍歷房間時,如調用gr函數去感染第i行時,其實第i+1行也被感染,再去感染第i+1行時就包含了同一天已被感染的人。所以我這兒用另外一個數組aa[][]將當前感染立馬存儲,便 有了如下代碼:

 1 #include<iostream>
 2 using namespace std;
 3 char a[101][101], aa[101][101];//a數組用於存放上一天的感染情況,aa數組用於存放當天被感染情況。  4 int n, m, cnt=0;
 5 int next[4][4]={{0,1},{1,0},{-1,0},{0,-1}};
 6 void gr(int x, int y)
 7 {
 8     int dx, dy;
 9     for(int i=0; i<4; i++)
10     {
11         dx=x+next[i][0];
12         dy=y+next[i][1];
13         if(dx>0 && dx<=n && dy>0 && dy<=n && a[dx][dy]=='.')//注意這里是判斷a數組 14         {
15             aa[dx][dy]='@';//注意這里是aa數組 16         }        
17     }
18 }
19 int main()
20 {
21     cin>>n;
22     for(int i=1; i<=n; i++)
23         for(int j=1; j<=n; j++)
24         {
25             cin>>a[i][j];
26             aa[i][j]=a[i][j];
27         }        
28     cin>>m;
29     for(int k=2; k<=m; k++)
30     {
31         for(int i=1; i<=n; i++)
32             for(int j=1; j<=n; j++)
33             {
34                 if(a[i][j]=='@')gr(i,j);//這里是根據前一天病毒感染情況來進行感染 35             }
36         for(int i=1; i<=n; i++)//把當天感染結果再賦值給了a數組 37             for(int j=1; j<=n; j++)    
38                 a[i][j]=aa[i][j];
39                 
40     }
41     for(int i=1; i<=n; i++)
42         for(int j=1; j<=n; j++)
43             if(a[i][j]=='@')cnt++;
44             
45     cout<<cnt<<endl;
46     return 0;
47 }

代碼是長了點,但還是容易理解的!這個題關鍵是搞清楚數組存儲已被感染和待被感染,以及他們之間的關系,其實還是包含最簡單的遞推思想的!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM