zoukankan      html  css  js  c++  java
  • nyoj27-水池数目【DFS】

    题目描述:

    南阳理工学院校园里有一些小河和一些湖泊,现在,我们把它们通一看成水池,假设有一张我们学校的某处的地图,这个地图上仅标识了此处是否是水池,现在,你的任务来了,请用计算机算出该地图中共有几个水池。

    输入描述:

    第一行输入一个整数N,表示共有N组测试数据
    每一组数据都是先输入该地图的行数m(0<m<100)与列数n(0<n<100),然后,输入接下来的m行每行输入n个数,表示此处有水还是没水(1表示此处是水池,0表示此处是地面)

    输出描述:

    输出该地图中水池的个数。
    要注意,每个水池的旁边(上下左右四个位置)如果还是水池的话的话,它们可以看做是同一个水池。
    

    样例输入:

    复制

    2
    3 4
    1 0 0 0 
    0 0 1 1
    1 1 1 0
    5 5
    1 1 1 1 0
    0 0 1 0 1
    0 0 0 0 0
    1 1 1 0 0
    0 0 1 1 1

    样例输出:

    2
    3

    思路:此题是深搜,如果搜到一个水池,那么我们就将其上下左右(范围内)继续搜,将搜到的置0表示已经搜索过了,一直到搜索结束,水池数目加一;

    #include <iostream>
    #include<cstdio>
    using namespace std;
    int m,n,a[101][101];
    void dfs(int x,int y)
    {
        if(0<=x && x<m && 0<=y && y<n && a[x][y]==1) 
        {                        //确保不越界
            a[x][y]=0;           //置0,表示已经搜索过了
            dfs(x,y-1);
            dfs(x,y+1);
            dfs(x-1,y);
            dfs(x+1,y);
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int count=0;
            scanf("%d%d",&m,&n);
            for(int i=0;i<m;++i)
                for(int j=0;j<n;++j)
                    scanf("%d",&a[i][j]);
            for(int i=0;i<m;++i)
            {
                for(int j=0;j<n;++j)
                {
                    if(a[i][j]==1)
                    {
                        dfs(i,j);
                        ++count;      //直到附近搜索完成后水池数目加一
                    }
                }
            }
            printf("%d
    ",count);
        }
        return 0;
    }
    
  • 相关阅读:
    Linux速成(二)
    Linux速成(一)
    突如其来的有赞电话面试!
    mark一下岗位
    游戏道具上下架设计
    ET框架学习-ECS组件式编程的基本思想之于UNITY
    一个类似与地平线中的车漆画板制作
    unity用刚体做玩家移动和玩家看向鼠标点
    C#简单的消除注释
    拉格朗日差值法, 快速排序.
  • 原文地址:https://www.cnblogs.com/aerer/p/9931008.html
Copyright © 2011-2022 走看看