涉及算法:深度搜索算法
題目:測試
題目描述 小新是個調皮的孩子,他老是會把衣服搞髒,他的媽媽美伢很是的生氣,因而在《和媽媽的約定條款》加上了第三百七十七條:小新衣服上每有一塊污漬媽媽就會打小新的小屁屁一下做爲懲罰。咱們規定若是兩個污漬相鄰(直接相鄰的上下左右、左上、左下,右上、右下都算相鄰)那麼它們就算是一塊污漬。如今小新又把衣服搞髒了,請你幫他算一算他的屁股上會挨幾巴掌? 輸入 輸入將會包含多組測試數據,每組測試數據將會以m和n開頭,表示將會用m行n列的網格表明小新的衣服,若是m=0輸入結束;1 <= m <= 100 而且1 <= n <= 100.接下來是m行n列的網格,網格中’@’表明污漬,’*’表明沒有污漬。 輸出 對於每組數據,請輸出小新屁股捱到的巴掌的數量。
樣例輸入spa
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0
樣例輸出code
0 1 2 2
大體搜索步驟:搜到一個是污漬後,標記上「已搜過」,緊接着搜它的周圍,重複此步驟。遇到*後就中止,回到上一層。走到不能搜的點後跳過,搜完後也回到上一層。blog
注意:搜索前要判斷該點是否越界,是否已搜過。get
代碼:string
#include<stdio.h> #include<string.h> int color(int x, int y); char map[101][101]; int res[101][101]; int direct[4]={-1,0,1}; int m,n; int main(){ int flag; int i,j; while(scanf("%d%d",&m,&n)!=EOF){ getchar(); memset(map,0,sizeof(map)); memset(res,0,sizeof(res)); flag=0; if (m==0) break; for(i=0;i<m;i++){ gets(map[i]); } for(i=0;i<m;i++) for(j=0;j<n;j++){ if (res[i][j]!=0) continue; else{ flag+=color(i,j); } } printf("%d\n",flag); } return 0; } int color(int x, int y){ int i,j; if(map[x][y]=='*') return 0; else{ res[x][y]=1; for(i=0;i<3;i++) for(j=0;j<3;j++){ if(x+direct[i]>=0 && x+direct[i]<m && y+direct[j]>=0 && y+direct[j]<n && (!res[x+direct[i]][y+direct[j]])){//注意邏輯取反!,而不是用位取反~ color(x+direct[i],y+direct[j]);//上下左右檢測的便捷寫法,每種狀況都要判斷邊界,判斷是否已讀 } } } return 1; }