acm:屁屁上的巴掌

涉及算法:深度搜索算法

題目:測試

題目描述

小新是個調皮的孩子,他老是會把衣服搞髒,他的媽媽美伢很是的生氣,因而在《和媽媽的約定條款》加上了第三百七十七條:小新衣服上每有一塊污漬媽媽就會打小新的小屁屁一下做爲懲罰。咱們規定若是兩個污漬相鄰(直接相鄰的上下左右、左上、左下,右上、右下都算相鄰)那麼它們就算是一塊污漬。如今小新又把衣服搞髒了,請你幫他算一算他的屁股上會挨幾巴掌?


輸入

輸入將會包含多組測試數據,每組測試數據將會以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;
}
相關文章
相關標籤/搜索