您的位置:首页 > 其它

重学搜索yi.2:Lake Counting--dfs

2016-07-23 17:10 453 查看
<挑战>p32

Lake Counting

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 28942 Accepted: 14490
Description
Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer
John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.

Given a diagram of Farmer John's field, determine how many ponds he has.
Input
* Line 1: Two space-separated integers: N and M

* 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
* Line 1: The number of ponds in Farmer John's field.
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
OUTPUT DETAILS:

There are three ponds: one in the upper left, one in the lower left,and one along the right side.
Source
USACO 2004 November

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

char lake[110][110];
int vis[110][110];
int coun = 0;
int n, m;

int dir[8][2] = {1, 1, -1, -1, 1, 0, 0, 1, -1, 0, 0, -1, 1, -1, -1, 1};

void findl(int x, int y)
{
int dx, dy;
for (int i=0; i<8; i++)
{
dx = dir[i][0] + x;
dy = dir[i][1] + y;
if (dx < n && dx >= 0 && dy < m && dy >= 0)
{
if (lake[dx][dy] == 'W' && !vis[dx][dy])
{
vis[dx][dy] = 1;
findl(dx, dy);
}
}
}
}

int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
memset(vis, 0, sizeof(vis));
memset(lake, 0, sizeof(lake));
coun = 0;
getchar();
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
scanf("%c", &lake[i][j]);
}
getchar();
}
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
if (lake[i][j] == 'W' && !vis[i][j])
{
vis[i][j] = 1;
findl(i, j);
coun++;
}
}
}
cout << coun << endl;
}
return 0;
}
/*
#include <iostream>
#include <cstdio>

using namespace std;

const int maxn = 110;

int n, m;
char filed[maxn][maxn+1];

void dfs(int x, int y)
{
filed[x][y] = '.';
for (int dx=-1; dx<=1; dx++)
{
for (int dy=-1; dy<=1; dy++)
{
int nx = x + dx;
int ny = y + dy;
if (nx>=0 && nx<n && ny>=0 && ny<m && filed[nx][ny] == 'W')
{
dfs(nx, ny);
}
}
}
return ;
}

void solve()
{
int res = 0;
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
if (filed[i][j] == 'W')
{
dfs(i, j);
res++;
}
}
}
printf("%d\n", res);
}

int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
getchar();
for (int i=0; i<n; i++)
{
for (int j=0; j<m; j++)
{
scanf("%c", &filed[i][j]);
}
getchar();
}
solve();
}

return 0;
}*/

/*
10 12 W........WW. .WWW.....WWW ....WW...WW. .........WW. .........W.. ..W......W.. .W.W.....WW. W.W.W.....W. .W.W......W. ..W.......W.
*/


找了好久好久的bug呀~~~~结果是我的输入有问题~~醉醉的~~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: