• POJ-2386(深广搜基础)


    Lake Counting
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 25322   Accepted: 12759

    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

    思路:
    很基础的一道题目,入门级别,有助于理解搜索的本质以及bfs和dfs的区别
    这个题可以用“扫雷”的思维来形象的理解,即遇到一个'W',点一下这个点,则与它相邻的一片为‘W’的点都变成‘.’了
    而我们只需要从头开始遍历一共有多少个这样的W即可

    dfs:
    #include <stdio.h>
    #define maxn 107
    
    int n,m;
    char g[maxn][maxn];
    int dir[10][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,0},{1,-1},{1,1}};
    
    void dfs(int x,int y){    
        g[x][y] = '.';//此行代码意义重大,相当于将其置为已访问状态    
        for(int i = 0;i < 8;i++) {        
            int dx = x+dir[i][0];        
            int dy = y+dir[i][1];        
            if(dx>n||dx<1||dy<1||dy>m)            
                continue;        
            if(g[dx][dy] == '.')            
                continue;        
            dfs(dx,dy);    
        }
    }
    int main()
    {    
        while(scanf("%d%d",&n,&m)!=EOF)    {        
            int ans = 0;        
            for(int i = 1;i <= n;i++)            
                scanf("%s",g[i]+1);  
            int cnt = 0;
            for(int i = 1;i <= n;i++)        
            for(int j = 1;j <= m;j++) {
                if(g[i][j] == 'W') {                
                    ans++;                
                    dfs(i,j);//把所有和该点相邻的W都变成.            
                }        
            }
            printf("%d
    ",ans);    
        }    
        return 0;
    }

    bfs:

    #include <iostream>
    #include <cstdio>
    #include <queue>
    using namespace std;
    
    int n,m;
    char G[107][107];
    int dir[8][2] = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
    typedef pair<int,int> node;
    
    void bfs(int x,int y)
    {
        G[x][y] ='.';//比较好的一种处理方法,省去开vis数组
        priority_queue<node> q;//q中存储了(x,y)点的所有连通点 
        q.push(make_pair(x,y));
        while(!q.empty())
        {
            node t = q.top();
            q.pop();
            int tx = t.first;
            int ty = t.second; 
            for(int i = 0;i < 8;i++)
            {
                int dx = tx+dir[i][0];
                int dy = ty+dir[i][1];
                if(dx>=1&&dx<=n&&dy>=1&&dy<=m && G[dx][dy]=='W') {
                    G[dx][dy] = '.';
                    q.push(make_pair(dx,dy));
                }
            }
        }
    }
    
    int main()
    {
        while(cin>>n>>m)
        {
            int ans = 0;
            for(int i = 1;i <= n;i++)
                scanf("%s",&G[i][1]);
    
            for(int i = 1;i <= n;i++)
                for(int j = 1;j <= m;j++) 
                    if(G[i][j]=='W') {
                        bfs(i,j);
                        ans++;
                    }
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    SetWindowsHookEx详解
    C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
    C#使用全局钩子(hook),SetWindowsHookEx返回0、不回调的解决
    how to get geometry type of layer using IMapServer3 and IMapLayerInfo? (C#)
    how to get geometry type of layer using IMapServer3 and IMapLayerInfo? (C#)
    windows cmd命令显示UTF8设置
    windows cmd命令显示UTF8设置
    C#写的NoSQL开源项目/系统(系列)
    TCP协议详解(2)
    红黑树
  • 原文地址:https://www.cnblogs.com/immortal-worm/p/5021287.html
Copyright © 2020-2023  润新知