c++ Lake Counting

Lake Counting(bfs dfs)

题目描述

样例输入

10 12
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 .

样例输出

3

dfs代码

#include <stdio.h>//includes
#include <iostream>//up
using namespace std;//
int N, M;//定义行,列
char field[101][101];//整个院子(矩阵)
void dfs(int x,int y)//dfs
{
    field[x][y] = '.';//标为没有积水
    for (int dx = -1; dx <= 1; dx++)//枚举x坐标
    {//循环遍历8个方向
        for (int dy = -1; dy <= 1; dy++)//枚举x坐标
        {
            int nx = x + dx, ny = y + dy;//移动到遍历的方向
            if (0 <= nx && nx < N && 0 <= ny && ny < M&&field[nx][ny] == 'W')//判断是否穿墙 并且有积水
                dfs(nx, ny);//递归搜索下一个积水
        }
    }
    return;//退出
}

void solve()//solve基本输入 调用函数 
{
    int res = 0;//计数器
    for (int i = 0;i < N;i ++)//输入
    {
        for (int j = 0;j < M;j ++)//up
        {
            cin >> field[i][j];//up
        }
    }
    for (int i = 0; i < N; i++) //查找第一处积水
    {
        for (int j = 0; j < M; j++) //up
        {
            if (field[i][j] == 'W') //如果有积水
            {
                dfs(i, j);//调用函数递归查找所有节点
                res++;//计数器 + 1
            }
        }
    }
    printf("%d", res);//打印结果 Print res
}

int main() //main
{
    scanf("%d%d", &N,&M);//输入行和列
    solve();//调用solve
   // system("pause");
    return 0;//return
}

posted @ 2019-07-31 18:26  牛大了的牛大  阅读(361)  评论(0编辑  收藏  举报