【NOI OJ】1818 紅與黑
阿新 • • 發佈:2019-02-08
1818:紅與黑
- 總時間限制:
- 1000ms
- 記憶體限制:
- 65536kB
- 描述
- 有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程式,計算你總共能夠到達多少塊黑色的瓷磚。
- 輸入
-
包括多個數據集合。每個資料集合的第一行是兩個整數W和H,分別表示x方向和y方向瓷磚的數量。W和H都不超過20。在接下來的H行中,每行包括W個字元。每個字元表示一塊瓷磚的顏色,規則如下
1)‘.’:黑色的瓷磚;
2)‘#’:白色的瓷磚;
3)‘@’:黑色的瓷磚,並且你站在這塊瓷磚上。該字元在每個資料集合中唯一出現一次。
當在一行中讀入的是兩個零時,表示輸入結束。 - 輸出
- 對每個資料集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。
- 樣例輸入
-
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 0 0
- 樣例輸出
-
45
- 來源
- 1979
-
#--------------------------------------------------------------------------------#
- 還是一道DFS的深搜題,主體思路:
- 找到“@”後,進入函式,上下左右搜尋,if(跑出陣列||撞牆)便return
-
遞迴一次便sum++
- 相信基本上算是深搜十分簡單的題。。。
- 看看原始碼:
-
#include<cstdio> #include<cstring> char a[22][22]; int w,h; int maxn; void r(int x,int y,int sum) { if(x<0||y<0||x==h||y==w||a[x][y]=='#') return; a[x][y]='#'; r(x+1,y,sum+1); r(x-1,y,sum+1); r(x,y-1,sum+1); r(x,y+1,sum+1); if(sum>maxn) maxn=sum; } int main() { while(1) { scanf("%d%d\n",&w,&h); if(w==0&&h==0) return 0; int x,y; for(int i=0;i<h;i++) { for(int j=0;j<w;j++) { scanf("%c",&a[i][j]); if(a[i][j]=='@') { x=i; y=j; } } getchar(); } r(x,y,1); printf("%d\n",maxn); memset(a,'\0',sizeof(a)); } return 0; }
- 但是!!!
- wrong了!!
- why?
- why?
- why?
- 在請ac的同學看看後,頓時無語……
- 再看看題:
- 請寫一個程式,計算你總共能夠到達多少塊黑色的瓷磚。
- 我呢……
if(sum>maxn) maxn=sum;
算的是最大!!!- 欲哭無淚……
- 於是果斷刪掉此段:
#include<cstdio> #include<cstring> char a[22][22]; int w,h; int sum; void r(int x,int y) { if(x<0||y<0||x==h||y==w||a[x][y]=='#') return; sum++; a[x][y]='#'; r(x+1,y); r(x-1,y); r(x,y-1); r(x,y+1); } int main() { while(1) { scanf("%d%d",&w,&h); if(w==0&&h==0) return 0; int x,y; getchar(); for(int i=0;i<h;i++) scanf("%s",a[i]); for(int i=0;i<h;i++) for(int j=0;j<w;j++) if(a[i][j]=='@') { x=i; y=j; break; } r(x,y); printf("%d\n",sum); memset(a,'\0',sizeof(a)); } return 0; }
- 還是wrong了!
- 為什麼……
- 找找找
- 調調調
- 發現了!!!直接吐血……
- 看看修改後的:
<span style="font-size:18px;">#include<cstdio> #include<cstring> char a[22][22]; int w,h; int sum; void r(int x,int y) { if(x<0||y<0||x==h||y==w||a[x][y]=='#') return; sum++; a[x][y]='#'; r(x+1,y); r(x-1,y); r(x,y-1); r(x,y+1); } int main() { while(1) { scanf("%d%d",&w,&h); if(w==0&&h==0) return 0; int x,y; getchar(); for(int i=0;i<h;i++) scanf("%s",a[i]); for(int i=0;i<h;i++) for(int j=0;j<w;j++) if(a[i][j]=='@') { x=i; y=j; break; } r(x,y); printf("%d\n",sum); memset(a,'\0',sizeof(a)); sum=0; } return 0; }</span>
發現了嗎sum=0;
- 歸零!
- 歸零!
- 歸零!
- 再交一遍
- 總結一下,一共兩點:
- 1.認真讀題!
- 2.有多組測試資料時sum,ans等變數要清零!
- By WZY