Description
Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.
Output
Sample Input
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
Sample Output
3
Hint
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
Source
/*
* 假设从任意一点W开始,不停地把邻接的部分用'.'代替。1次DFS之后与初始动这个W连接的所有W都被替换成'.'因此直到图中不再存在W为止。
* 总共进行DFS的次数就是最后的结果咯!8个方向对应了8种状态转移,每个各自作为DFS的参数至多被调用一次,所以时间复杂度为:O(8*N*M)。
*
*/
#include <iostream>
using namespace std;
char pos[101][101];
int n,m;
void dfs(int x, int y)
{
pos[x][y] = '.';
for(int dx = -1; dx <= 1; dx++)
for(int dy = -1; dy <= 1; dy++)
{
int nx = x + dx, ny = y + dy;
if(0<=nx&&nx<n&&0<=ny&&ny<m&&pos[nx][ny]=='W')
dfs(nx,ny);
}
return ;
}
int main(void)
{
while(cin>>n>>m)
{
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
cin>>pos[i][j];
int res = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
{
if(pos[i][j] == 'W')
{
dfs(i,j);
res++;
}
}
cout<<res<<endl;
}
return 0;
}
2115



被折叠的 条评论
为什么被折叠?



