zoukankan      html  css  js  c++  java
  • 【noip模拟赛5】水流

      

    描述

     

    全球气候变暖,小镇A面临水灾。于是你必须买一些泵把水抽走。泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里。小镇可以认为是N * M的矩阵。矩阵里的每个单元格都是一个‘a’- ‘z’小写字母,该小写字母表示该格子的高度,字母大的表示该单元格比较高,反之,表示该格子高度比较低。当前单元格的水可以流到上、下、左、右四个格子,但必须满足这些格子的高度是小于或者等于当前格子的高度。现在,给你一些N * M的矩阵,你至少要买多少个泵,才能把所有格子的水都能被抽走?

    输入

     

    多组测试数据。

    第一行:K,表示有K组测试数据。(1<=K<=5)

    接下来有K组测试数据,每组测试数据格式如下:

    第一行:两个正数, N,M 。 1<=N,M<=50,表示小镇的大小。

    接下来有N行,每行有M个小写字母,表示小镇的地图。

    输出

     

    K行,每行对应一组数据。至少要买多少个泵,才能把所有格子的水都能抽走。

    输入样例 1 

    2 
    5  5 
    ccccc
    cbbbc
    cbabc
    cbbbc
    ccccc
    4  9 
    cbabcbabc
    cbabcbabc
    cbabcbabc
    cbabcbabc

    输出样例 1

    1
    2

    思路:对当前最低位置进行dfs染色即可
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 60
    
    int dx[4]={0,1,-1,0};
    int dy[4]={1,0,0,-1};
    int n,m;
    int inmap(int x,int y)
    {
        return x>=1&&y>=1&&x<=n&&y<=m;
    }
    char mp[N][N];
    int vis[N][N];
    void dfs(int x,int y)
    {
        vis[x][y]=1;
        rep(i,0,3)
        {
            int a=x+dx[i];
            int b=y+dy[i];
            if(!inmap(a,b)||vis[a][b])continue;
            if( mp[x][y]<=mp[a][b] )
                dfs(a,b);
        }
    }
    
    
    int main()
    {
        int t;RI(t);
        while(t--)
        {
            RII(n,m);
            CLR(vis,0);
            rep(i,1,n)
            RS(mp[i]+1);
            int cnt=0;
            for(char k='a';k<='z';k++)
            rep(i,1,n)
            rep(j,1,m)
            if(!vis[i][j]&&mp[i][j]==k)
            {
                cnt++;
                dfs(i,j);
            }
            cout<<cnt<<endl;
        }
    }
    View Code




  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/bxd123/p/10554671.html
Copyright © 2011-2022 走看看