【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




猜你喜欢

转载自www.cnblogs.com/bxd123/p/10554671.html