有一个大小为N*M的园子,雨后积起了水。八连通的计税被认为是连接在一起的。请求出园子里总共有多少水洼?
(八连通指的是下图中相对w的*的部分)
输入园子的积水矩阵图,w表示积水,.表示没有积水
输出水洼个数,为3
如图三个水洼为红色圈起的部分:
实现思路:首先需要明白构成同一个水洼的条件,即如果能够成同一个水洼,那么该区域中的所有积水点是连通的(八连通),因此为了寻找园子中的积水连通区域,我们需要在整个园子中进行搜索。
为了能够全面搜索,我们遍历整个园子,每遇到一个积水点,则就从该积水点开始搜索出所有与之连通的积水点,为了能够全面搜索,我们采用深度优先搜索,并将经过的积水点进行标记(这里我们标记成’.’),避免出现环路。
public class AlgorithmCenter200714
{
private char[,] a = new char[,]{
{
'w','.','.','.','.','.','.','.','.','w','w','.' },
{
'.','w','w','w','.','.','.','.','.','w','w','w' },
{
'.','.','.','.','w','w','.','.','.','w','w','.' },
{
'.','.','.','.','.','.','.','.','.','w','w','.' },
{
'.','.','.','.','.','.','.','.','.','w','.','.' },
{
'.','.','w','.','.','.','.','.','.','w','.','.' },
{
'.','w','.','w','.','.','.','.','.','w','w','.' },
{
'w','.','w','.','w','.','.','.','.','.','w','.' },
{
'.','w','.','w','.','.','.','.','.','.','w','.' },
{
'.','.','w','.','.','.','.','.','.','.','w','.'}
};
private int h => a.GetLength(0);//10
private int w => a.GetLength(1);//12
///
/// 计算水洼个数
///
///
///
public int CaluatePuddleCount()
{
int count = 0;
//查找矩阵中的w,从'w'开始dfs
for (int i=0;i<h;i++)
{
for (int j = 0; j < w; j++)
{
if (a[i,j] == 'w')
{
//对每个'w'进行8个方向上的dfs
Dfs(i,j);
count++;
}
}
}
return count;
}
private void Dfs(int x,int y)
{
a[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 < h && ny >= 0 && ny < w && a[nx, ny] == 'w')
Dfs(nx,ny);
}
}
}
}