题解报告:POJ 2386--Lake Counting(BFS+DFS)

简介: 给你一副图n行m列,其中’W’代表池塘,’.'代表土地,问现在这幅图中有多少个池塘,如果一个池塘的八个方向上如果有池塘,则只算一个,类似于连通块,求有多少个连通块。

题意:给你一副图n行m列,其中’W’代表池塘,’.'代表土地,问现在这幅图中有多少个池塘,如果一个池塘的八个方向上如果有池塘,则只算一个,类似于连通块,求有多少个连通块。


思路:bfs和dfs


BFS


用队列实现,需要用到pair或者结构体存储下标,通过找到一个w然后用队列实现连通功能的块。


#include<iostream>
#include<queue>
#include<map>
using namespace std;
const int maxn = 105;
char a [maxn][maxn];
pair<int ,int >m1;
typedef pair<int ,int >P;
queue<pair<int ,int > >mo;
void bfs(int x,int y ,int n ,int m){
    int i,j;
    while(!mo.empty()){
             P d = mo.front();
             mo.pop();
             for(i=-1;i<=1;i++){
                    for(j=-1;j<=1;j++){
                        int x1,y1;
                        x1=d.first+i,y1=d.second+j;
                        if(x1>=0&&x1<n&&y1>=0&&y1<m&&a[x1][y1]=='W'){
                                a[x1][y1]='.';
                                mo.push(P(x1,y1));
                        }
                    }
             }
 }
}
int solve(int  n,  int m ){
    int ans = 0,i,j;
    for(i = 0 ;i < n ; i++){
        for( j = 0 ;j < m ;j++){
            if(a[i][j]=='W'){
                ans++;
                mo.push(P(i,j));
                bfs(i,j,n,m);
            }
        }
    }
    return ans;
}
int  main()
{
    int n , i , j , m ;
    cin >> n >> m;
    for(i = 0; i < n; i ++){
         for(j = 0; j < m ;j++)
                cin >> a[i][j];
    }
    int ans=0;
    ans=solve(n,m);
    cout << ans <<endl;
}


DFS


查找到了为水坑的低点之后就继续搜索不断查找=。=


#include<iostream>
using namespace std;
const int maxn = 105;
char a [maxn][maxn];
void dfs(int x, int y,int n,int m  ){
    int i,j,b,c;
    for(i = -1;i <= 1;i++){
        for(j = -1 ;j <=1 ;j++){
               b=i+x;
               c=y+j;
               if(b>=0&&b<n&&c>=0&&c<m&&a[b][c]=='W'){
                    a[b][c]='.';
                    dfs(b,c,n,m);
               }
        }
    }
}
int solve (int n,int m ){
    int ans = 0,i,j;
    for(i = 0; i  < n ;i ++){
        for( j = 0 ; j < m ;j ++){
            if(a[i][j]=='W'){
                dfs(i,j,n,m);
                ans++;
            }
        }
 }
    return ans;
}
int  main()
{
    int n , i , j , m ;
    cin >> n >> m;
    for(i = 0; i < n; i ++){
         for(j = 0; j < m ;j++)
                cin >> a[i][j];
    }
    int ans=0;
    ans=solve(n,m);
    cout << ans <<endl;
}
相关文章
|
6月前
|
流计算
POJ 3620--Avoid The Lakes【DFS】
POJ 3620--Avoid The Lakes【DFS】
30 0
|
6月前
【每日一题Day295】LC617合并二叉树 | DFS BFS
【每日一题Day295】LC617合并二叉树 | DFS BFS
24 0
|
Java
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
hdu1016 Prime Ring Problem【素数环问题(经典dfs)】
50 0
|
存储 容器
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
华为机试HJ41:称砝码(深度优先遍历dfs-Depth First Search)
145 0
|
机器学习/深度学习 算法
算法每日一题:P2089 烤鸡 -DFS练习
算法每日一题:P2089 烤鸡 -DFS练习
|
算法 Java 索引
【算法题解】 Day10 BFS | DFS
今天的算法是 「BFS | DFS」 相关,“算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,以实战习题的形式理解算法,使用算法。”
104 0
|
算法 Java Python
【算法题解】 Day6 BFS | DFS
今天的算法是 「BFS | DFS」 相关,“算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,以实战习题的形式理解算法,使用算法。”
103 0
|
定位技术 ice
POJ-3009,Curling 2.0(DFS)
POJ-3009,Curling 2.0(DFS)
|
机器学习/深度学习
POJ-1321,棋盘问题(DFS)
POJ-1321,棋盘问题(DFS)