水流(water)

时间限制: 1 Sec  内存限制: 64 MB
提交: 9  解决: 2
[提交][状态][讨论版]

题目描述

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

输入

多组测试数据。
第1行:K,表示有K组测试数据,1≤K≤5。
接下来有K组测试数据,每组测试数据格式如下:
第1行:两个正整数,N,M。1≤N,M≤50,表示小镇的大小。
接下来有N行,每行有M个小写字母,表示小镇的地图。

输出

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

样例输入

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

样例输出

1
2

【分析】我是用BFS写的,从z遍历到a,我们实验室有位大神用DFS过了一发,不过时间比我长,下面是两段AC代码。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define inf 0x3f3f3f3f
#define mod 1000000007
typedef long long ll;
using namespace std;
const int N=;
int n,dp[N],len;
string w[N];
int vis[N][N];
int m,t;
int d[][]={,,,,-,,,-};
set<int>p;
int minn=inf;
struct man {
int x,y;
int st;
};
queue<man>q;
void bfs(int aa,int bb,char ch) {
man s;s.x=aa;s.y=bb;s.st=ch;q.push(s);
vis[aa][bb]=;
while(!q.empty())
{
man t=q.front();q.pop();
for(int i=;i<;i++)
{
int xx=t.x+d[i][],yy=t.y+d[i][];
if(xx>=&&xx<n&&yy>=&&yy<m&&w[xx][yy]>=t.st&&vis[xx][yy]==)
{
man k;k.x=xx;k.y=yy;k.st=w[xx][yy];vis[xx][yy]=;q.push(k);
}
}
}
} int main() {
cin>>t;
while(t--) {
int ans=;
while(!q.empty())q.pop();
memset(vis,,sizeof(vis));
cin>>n>>m;
for(int i=; i<n; i++)cin>>w[i];
for(char ch='a'; ch<='z'; ch++) {
for(int i=; i<n; i++) {
for(int j=; j<m; j++) {
if(w[i][j]==ch&&vis[i][j]==)
{
ans++;
bfs(i,j,ch);
}
}
}
}
cout<<ans<<endl;
}
return ;
}

BFS

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include <climits>
#include <map>
using namespace std;
const int MAXN = ;
int N, M;
char maze[MAXN][MAXN];
char s[MAXN][MAXN];
int xi[] = {, , -, };
int yi[] = {, -, , };
void dfs(int x, int y) {
s[x][y] = ;
for(int i = ; i < ; i++) {
int nx = x + xi[i];
int ny = y + yi[i];
//printf("%d %d %c\n", nx, ny,maze[nx][ny]);
if(nx>= && nx < N && ny >= && ny < M && s[nx][ny] == && maze[nx][ny] >= maze[x][y]) {
dfs(nx, ny);
}
}
}
int main() {
int t = ;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &N, &M);
for(int i = ; i < N; i++) {
scanf("%s", maze[i]);
}
memset(s, , sizeof(s));
int cnt = ;
for(char c = 'a'; c <= 'z'; c++) {
for(int i = ; i < N; i++) {
for(int j = ; j < M; j++) {
if(s[i][j] == && maze[i][j] == c){
dfs(i, j);
cnt++;
}
}
}
}
printf("%d\n", cnt); } return ;
}

DFS

												

水流(water)(BFS)(DFS)的更多相关文章

  1. 水流(water)

    水流(water) 题目描述 全球气候变暖,小镇A面临水灾,于是你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里.小镇可以认为是N×M的矩阵 ...

  2. POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)

    思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...

  3. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  4. Collect More Jewels(hdu1044)(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  5. Cleaning Robot (bfs+dfs)

    Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...

  6. LeetCode:BFS/DFS

    BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...

  7. (BFS/DFS) leetcode 200. Number of Islands

    Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surro ...

  8. 搜索入门_简单搜索bfs dfs大杂烩

    dfs题大杂烩 棋盘问题  POJ - 1321 和经典的八皇后问题一样.  给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...

  9. POJ 3414 Pots (BFS/DFS)

    Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7783   Accepted: 3261   Special Ju ...

随机推荐

  1. [CQOI2012]局部极小值

    题目链接 注意到\(4\times 7\)的矩阵的局部极小值最多只有8个,可以状压. 设\(f[i][sta]\)表示从小到大填数,当前填到\(i\),极小值的填充状态为\(sta\)的方案数. 考虑 ...

  2. [luogu P1442] 铁球落地

    题目链接 线段树\(+dp\). 先用线段树预处理出每个线段从左边和右边掉落到哪里,记为\(f[i][0/1]\). 然后记\(g[i][0/1]\)为到达第\(i\)个线段的左边或右边所要的最小时间 ...

  3. CF763B Timofey and Rectangles

    题目戳这里. 首先答案肯定是YES,因为一个平面图肯定可以被4种颜色染色,关键是怎么输出方案. 由于4是一个特殊的数字\(4 = 2^2\),而我们还有一个条件就是边长为奇数,而奇数是会改变二进制位的 ...

  4. Js跑马灯效果 && 在Vue中使用

    DEMO: <!DOCTYPE html><html> <head> <title>滚动播报</title> <meta charse ...

  5. ERROR: Found lingering reference file hdfs

    Found lingering reference异常 ERROR: Found lingering reference file hdfs://jiujiang1:9000/hbase/month_ ...

  6. JS模块化工具requirejs教程02

    基本API require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短 define 从名字就可以看出 ...

  7. python imageai 对象检测、对象识别

    imageai库里面提供了目标识别,其实也可以说是目标检测,和现在很多的收集一样就是物体识别.他可以帮你识别出各种各样生活中遇见的事物.比如猫.狗.车.马.人.电脑.收集等等. 感觉imageai有点 ...

  8. 入园的第一篇--where、where

    这篇是入园的第一篇随便,后面我会将自己几年前写的博文都转到这里.哎,其实说到博文的事情,我就很郁闷,甚至有些恼火,后面我会详细说说这中间的过程,也许能帮助某些人避免遇到类似的事情.突然想起<西游 ...

  9. 关于background

    background目前有size;  color;  image;  repeat;position;attachtment; 作用分别是一:调整背景大小. 语法:background-size:a ...

  10. JMeter 分布式测试部署

    对于并发量很大的需求,如上万并发量,受到CPU和内存的限制,单机模拟场景是实现不了的,为了让JMeter提供更大的负载能力,须使用它的分布式机制,即多台机器同时产生负载的功能. 以下参数分析可用于配置 ...