描述
全球气候变暖,小镇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; } }