題目鏈接: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 }
代碼是長了點,但還是容易理解的!這個題關鍵是搞清楚數組存儲已被感染和待被感染,以及他們之間的關系,其實還是包含最簡單的遞推思想的!
