水流(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=55;
int n,dp[N],len;
string w[N];
int vis[N][N];
int m,t;
int d[4][2]={1,0,0,1,-1,0,0,-1};
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]=1;
while(!q.empty())
{man t=q.front();q.pop();for(int i=0;i<4;i++){int xx=t.x+d[i][0],yy=t.y+d[i][1];if(xx>=0&&xx<n&&yy>=0&&yy<m&&w[xx][yy]>=t.st&&vis[xx][yy]==0){man k;k.x=xx;k.y=yy;k.st=w[xx][yy];vis[xx][yy]=1;q.push(k);}}
}
}int main() {cin>>t;while(t--) {int ans=0;while(!q.empty())q.pop();memset(vis,0,sizeof(vis));cin>>n>>m;for(int i=0; i<n; i++)cin>>w[i];for(char ch='a'; ch<='z'; ch++) {for(int i=0; i<n; i++) {for(int j=0; j<m; j++) {if(w[i][j]==ch&&vis[i][j]==0){ans++;bfs(i,j,ch);}}}}cout<<ans<<endl;}return 0;
}

BFS

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

DFS

转载于:https://www.cnblogs.com/jianrenfang/p/5722569.html

水流(water)(BFS)(DFS)相关推荐

  1. 程序员面试金典 - 面试题 16.19. 水域大小(BFS/DFS)

    1. 题目 你有一个用于表示一片土地的整数矩阵 land,该矩阵中每个点的值代表对应地点的海拔高度. 若值为0则表示水域.由垂直.水平或对角连接的水域为池塘. 池塘的大小是指相连接的水域的个数. 编写 ...

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

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

  3. [Leetcode][第785题][JAVA][判断二分图][BFS][DFS]

    [问题描述][中等] [解答思路] 1. DFS 深度优先遍历 时间复杂度:O(N+M) 空间复杂度:O(N) class Solution {private static final int UNC ...

  4. LeetCode 1263. 推箱子(BFS+DFS / 自定义哈希set)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 BFS + DFS 1. 题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置. 游戏地图用大小为 n * m 的网 ...

  5. LeetCode 1034. 边框着色(BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 给出一个二维整数网格 grid,网格中的每个值表示该位置处的网格块的颜色. 只有当两个网格块的颜色相同,而且在四个方向中任 ...

  6. 全局路径规划:图搜索算法介绍1(BFS/DFS)

    对于全局路径规划的设计,我们先要了解什么是图搜索,在此之前,要先知道什么是图: 可以看到,图有很多种,有无向图,有向图,节点之间还可以有不同的weight, 用于表述从节点与节点直接迁移的代价. 而图 ...

  7. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...

    java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...

  8. 【八数码问题】基于状态空间法的知识表示与状态搜索:无信息搜索(BFS/DFS) 启发式搜索(A*)

    前言 一.问题引入 二.状态空间法 1. 知识及其表示 2. 状态空间法定义 3. 问题求解 三.基于状态空间搜索法解决八数码问题 1. 八数码问题的知识表示 2. 状态空间图搜索 1. 无信息搜索 ...

  9. bfs dfs 搜索入门模板题

    bfs & dfs 题目链接:https://vjudge.net/contest/404511 1.最短路(bfs) (1)一维最短路 D - Catch That Cow 题目大意: 在一 ...

最新文章

  1. 增强CNN学习能力的Backbone:CSPNet
  2. KVM中I/O设备直接分配和SR-IOV(十六)
  3. oracle 按日输出 取整数,Oracle按日周月分組統計,及next_day()函數詳解
  4. using 指令是不需要的和其他两个C#错误
  5. 卖软件源码、解决技术难题、做生意,都需要讲个基本原则【No Money No Code】
  6. web设计师和前端设计师的互动—前端工程师应该具备的三种思维
  7. SAP gateway 后台OData model data查看工具
  8. 用于基于SWT的应用程序的RichText编辑器组件
  9. Xamarin.Forms Button长按事件
  10. 洛谷 P4549 【模板】裴蜀定理
  11. 论剑乌镇:历届互联网大会热词盘点
  12. springboot踩过的坑
  13. python开发板卡驱动开发_一款能让你发挥无限创意的MicroPython开发板—TPYBoard开发板测...
  14. 独门绝技:一招克死所有病毒(转贴,没有用过)
  15. CoreBluetooth Central模式 Swift版
  16. 达梦安装与基本使用【进阶】
  17. 天气预报接口api(中国天气网)
  18. CATIA二次开发——元素隐藏
  19. Win10连接NAS网络存储器失败解决方法
  20. 【我的OpenGL学习进阶之旅】什么是PVR文件以及如何打开它?

热门文章

  1. 程序人生--拍婚纱照经历小记
  2. 箱线图怎么看_股票000882:怎么看月k线图「歙县股票网」
  3. 二进制反码求和java_简单又复杂的“整数类型”
  4. flash按钮html层遮罩
  5. matlab显示全球海岸线
  6. springboot毕设项目小区废弃物分类管理系统cf53s(java+VUE+Mybatis+Maven+Mysql)
  7. 第三方注解框架,黄牛刀.使用步骤和方法
  8. 人机工程学产品设计案例_儿童产品设计的那些原则【北京新易设计坊】
  9. 世界上最难弹奏的十首钢琴曲
  10. 计算机3d数字游戏是什么专业,天津电子信息职业技术学院获3D数字游戏艺术赛项一等奖...