Lake Counting
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lake Counting相关的知识,希望对你有一定的参考价值。
试题描述
|
有一个大小为M*N的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里共有多少水洼?(八连通指的是下面图中相对W的*的部分) |
输入
|
第一行包含两个正整数 N 和 M,表示将一个园子地面分成N*M块方格,N 行,M列,接下来的 N 行描述了园子地面状况,其中‘W’表示积水的水洼,‘.’表示没有积水。
|
输出
|
仅一个数,表示水洼的总数。
|
输入示例
|
10 12
w........ww. .www.....www ....ww...ww. .........ww. .........w.. ..w......w.. .w.w.....ww. w.w.w.....w. .w.w......w. ..w.......w. |
输出示例
|
3
|
其实就是八连块。用dfs(即深度搜索)可以解决。
1 #include <iostream> 2 #define MAXN 101 3 using namespace std; 4 char a[MAXN][MAXN]; 5 int m,n,flag[MAXN][MAXN]; 6 7 void dfs(int i,int j,int id) //dfs函数每运行一次,答案(即cnt)++; 8 { 9 if(i<0||i>=m||j<0||j>=n) return; //如果出界,退出递归 10 if(flag[i][j]>0||a[i][j]!=‘w‘) return; //如果当前格子搜索过或者不是水洼,退出递归 11 flag [i][j]=id;//记录当前格子被访问过 12 dfs(i-1,j-1,id); //开始八连块 13 dfs(i-1,j,id); 14 dfs(i-1,j+1,id); 15 dfs(i,j-1,id); 16 dfs(i,j+1,id); 17 dfs(i+1,j-1,id); 18 dfs(i+1,j,id); 19 dfs(i+1,j+1,id); 20 } 21 int main() 22 { 23 int j,i,cnt=0; 24 cin>>m>>n; 25 for(i=0;i<m;i++) 26 for(j=0;j<n;j++) cin>>a[i][j]; 27 for(i=0;i<m;i++) 28 { 29 for(j=0;j<n;j++) 30 { 31 if(flag[i][j]==0&&a[i][j]==‘w‘) dfs(i,j,++cnt); //如果是水洼,就以当前位置为中心向它的八个方面找水洼。 32 } 33 } 34 cout<<cnt; 35 return 0; 36 }
以上是关于Lake Counting的主要内容,如果未能解决你的问题,请参考以下文章