[CSP-S模拟测试]:water(BFS)
题目描述
有一块矩形土地被划分成$n\times m$个正方形小块。这些小块高低不平,每一小块都有自己的高度。水流可以由任意一块地流向周围四个方向的四块地中,但是不能直接流入对角相连的小块中。
一场大雨后,由于地势高低不同,许多地方都积存了不少降水。给定每个小块的高度,求每个小块的积水高度。
注意:假设矩形地外围无限大且高度为$0$。
输入格式
第一行包含两个非负整数$n,m$。
接下来$n$行每行$m$个整数表示第$i$行第$j$列的小块的高度。
输出格式
输出$n$行,每行$m$个由空格隔开的非负整数,表示每个小块的积水高度。
样例
样例输入:
3 3
4 4 0
2 1 3
3 3 -1
样例输出:
0 0 0
0 1 0
0 0 1
数据范围与提示
对于$20\%$的数据$n,m\leqslant 4$。
对于$40\%$的数据$n,m\leqslant 15$。
对于$60\%$的数据$n,m\leqslant 50$。
对于$100\%$的数据$n,m\leqslant 300$,$|$小块高度$|\leqslant {10}^9$。
在每一部分数据中,均有一半数据保证小块高度非负。
题解
首先需要明确一个问题,每一个块的最终高度就是所有从这个块走出这个矩形当中的最大高度的最小值(通读左边这句话三遍!!!)。
然后我利用了类似$SPFA$的思想进行$BFS$,先将最外面一圈加入队列,然后去更新它所能更新四个点的答案,如果一个点被更新,那么就重新将这个点压入队列即可。
时间复杂度:$\Theta(n\times m\times k)$($k$为较小常数,其实时间复杂度我也不太会证,毕竟是类$SPFA$思想)。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m;
long long Map[500][500];
long long dis[500][500];
queue<pair<int,int> > q;
void BFS()
{
while(!q.empty())
{
pair<int,int> flag=q.front(),wzc;
q.pop();
wzc=make_pair(flag.first-1,flag.second);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
wzc=make_pair(flag.first,flag.second-1);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
wzc=make_pair(flag.first+1,flag.second);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
wzc=make_pair(flag.first,flag.second+1);
if(wzc.first>1&&wzc.second>1&&wzc.first<n&&wzc.second<m)
if(dis[wzc.first][wzc.second]>max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]))
{
dis[wzc.first][wzc.second]=max(Map[wzc.first][wzc.second],dis[flag.first][flag.second]);
q.push(wzc);
}
}
}
int main()
{
memset(dis,0x3f,sizeof(dis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lld",&Map[i][j]);
for(int i=1;i<=n;i++)
{
dis[i][1]=max(0LL,Map[i][1]);
dis[i][m]=max(0LL,Map[i][m]);
q.push(make_pair(i,1));
q.push(make_pair(i,m));
}
for(int i=1;i<=m;i++)
{
dis[1][i]=max(0LL,Map[1][i]);
dis[n][i]=max(0LL,Map[n][i]);
q.push(make_pair(1,i));
q.push(make_pair(n,i));
}
BFS();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%lld ",max(0LL,dis[i][j]-Map[i][j]));
puts("");
}
return 0;
}
rp++
[CSP-S模拟测试]:water(BFS)的更多相关文章
- [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)
题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
- 安装nginx python uwsgi环境 以及模拟测试
uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 转 C#实现PID控制的模拟测试和曲线绘图
C#实现PID控制的模拟测试和曲线绘图 本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
- NOIP模拟测试1(2017081501)
好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...
随机推荐
- WPF数据模板中绑定事件不触发问题
今天比较闲,做一个练手的项目,结果在xaml中写了一个用户的数据模板后,在其中的某个Canvas上绑定了一个鼠标左击的事件,结果调试的时候,无论怎么点击都不跳到断点那里,百思不得其解. 之后尝试不绑定 ...
- 状压DP : [USACO06NOV]玉米田
玉米田 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ ...
- 应用安全-工具使用-Burpsuite
A cheat sheet for PortSwigger Burp Suite application security testing framework. Send to Repeater Ct ...
- vue.js2.0 (简易)水果商城 vuex vant-ui
vue.js2.0 (简易)水果商城 vuex vant-ui:https://segmentfault.com/a/1190000015690250 vue2.5全家桶 高仿vivo商城 百分之95 ...
- RMQ(鸽巢原理或字符串操作)
http://acm.hdu.edu.cn/showproblem.php?pid=3183 A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) ...
- jar包 war包
jar包和war包的区别: war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块.而jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令 ...
- JS 函数 学习笔记
函数是一段可以反复调用的代码块.函数还能接受输入的参数,不同的参数会返回不同的值 声明函数的 5 种方式 具名函数 (function 命令) function f(x, y){ return x + ...
- iconfont图标symbol引用方式,有的图标不能通过设置color样式来修改颜色的解决办法
现象:iconfont安装后的图标,是通过symbol引用方式,有的图标不能通过color修改颜色的解决办法,有的又可以. <svg class="icon" aria-hi ...
- 四、局域网连接SqlServer
一.局域网连接SqlServer 一台服务器上装有四个数据库的时候,我们可以通过IP\实例名的方式进行访问. navicat 连接sqlserver数据库
- python正则表达式 re (二)escape
背景: 在使用python的过程中,你肯定对转义字符的使用苦恼过,因为有的时候我们需要使用一些特殊符号如”$ * . ^”等的原意,有时候需要被转义后的功能,并且转义字符地使用很繁琐,容易出错,那拯救 ...