1. 程式人生 > >POJ 2386 - Lake Counting 題解

POJ 2386 - Lake Counting 題解

搜索 urn blog 題目 getchar() amp spa 16px include

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接:http://poj.org/problem?id=2386

題目大意:

給出一張N*M的地圖(1<=N,M<=100),地圖上的W表示水坑,.表示陸地。水坑是八方向連通的,問圖中一共有多少個水坑。

Sample Input

9
5 2 1 5 2 1 5 2 1
4
1 2 3 4
0

Sample Output

6
5

分析:

非常簡單的深搜。兩重循環遍歷這個地圖,遇到W就dfs來求出這一整個大水坑,並把搜索過的W修改為.

AC代碼:

 1 #include<algorithm>
 2
#include<cmath> 3 #include<cstdio> 4 #include<queue> 5 6 inline void read(int &x) 7 { 8 char ch = getchar(),c = ch;x = 0; 9 while(ch < 0 || ch > 9) c = ch,ch = getchar(); 10 while(ch <= 9 && ch >= 0) x = (x<<1)+(x<<3
)+ch-0,ch = getchar(); 11 if(c == -) x = -x; 12 } 13 14 char mp[110][110]; 15 int ans,n,m; 16 17 void dfs(int x,int y) 18 { 19 if(x == n+1 || y == m+1) 20 { 21 return; 22 } 23 for(int i = -1;i <= 1;++ i) 24 for(int j = -1;j <= 1;++ j) 25 {
26 if(i == 0 && j == 0) 27 continue; 28 if(x+i<1||x+i>n||y+j<1||y+j>m||mp[x+i][y+j] == .) 29 continue; 30 mp[x+i][y+j] = .; 31 dfs(x+i,y+j); 32 } 33 return; 34 } 35 36 int main() 37 { 38 // freopen("1.txt","r",stdin); 39 read(n),read(m); 40 for(int i = 1;i <= n;++ i) 41 scanf("%s",mp[i]+1); 42 for(int i = 1;i <= n;++ i) 43 for(int j = 1;j <= m;++ j) 44 if(mp[i][j] == W) 45 ans++,dfs(i,j); 46 printf("%d\n",ans); 47 }

POJ 2386 - Lake Counting 題解