POJ 2386 - Lake Counting 題解
阿新 • • 發佈:2017-09-09
搜索 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 題解