两道题差不多意思,就以POJ—2386 为准吧
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.
Given a diagram of Farmer John's field, determine how many ponds he has.
* 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.
* 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.
* Line 1: The number of ponds in Farmer John's field.
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
OUTPUT DETAILS:
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
There are three ponds: one in the upper left, one in the lower left,and one along the right side.
大体题意就是,给你一个M*N的矩形,这个矩形的每个单元格或以‘W’或以‘。’填充,要你在整个图中寻找W的连通块并计算其个数。
方法就是:遍历整个图,只要找到了W的单元格且未被标记就将其标记并使用DFS算法--用递归在该单元格八个方向寻找是否存在相同并连同的W单元格,对其进行与最开始发起搜索算法的连通块相同标号的标记。
每遍历到一个连通块,标记数字加一,最终得到图中连通块的数目
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define maxn 105
using namespace std;
int m, n, idex[maxn][maxn];
char field[maxn][maxn];
void Dfs(int x, int y, int id)
{
if(x < 0|| y < 0|| x >= m|| y >= n) return;
if(idex[x][y] != 0|| field[x][y] != 'W') return;
idex[x][y] = id;
for(int i = -1; i < 2; i++)
{
for(int j = -1; j < 2; j++)
{
if(i != 0|| j != 0)
{
Dfs(x + i, y + j, ++id);
}
}
}
}
int main()
{
cin >> m >> n;
memset(idex, 0, sizeof(idex));
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
cin >> field[i][j];
}
}
int cnt = 0;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(field[i][j] == 'W'&& idex[i][j] == 0)
{
Dfs(i, j, ++cnt);
}
}
}
cout << cnt << endl;
}