[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小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...
随机推荐
- JS对象—字符串总结(创建、属性、方法)
1.创建字符串 1.1 new String(s) String和new一起使用,创建的是一个字符串对象,存放的是字符串s的表示. 1.2 String(s) ...
- State Hook
1 useState函数的第一个参数,是state变量的初始值. 2 每次渲染时,多个State Hook的顺序.数量都是一样的.(不能多.不能少) 3 state变量是只读的 4 state变量发生 ...
- CSS中设置字体样式
<style type="text/css"> body{ font-family: SimHei,"微软雅黑",sans-serif; } < ...
- 16、NumPy ——字节交换
NumPy 字节交换 在几乎所有的机器上,多字节对象都被存储为连续的字节序列.字节顺序,是跨越多字节的程序对象的存储规则. 大端模式:指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地 ...
- opencv视频流的读取和处理
Opencv提供一个简单易用的框架以提取视频文件和USB摄像头中的图像帧,如果只是想读取某个视频,你只需要创建一个VideoCapture实例,然后在循环中提取每一帧.下面是一个简单的代码 #incl ...
- valueOf()对象返回值
valueOf()对象返回值 Array数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起.其操作与 Array.toString 和 Array.join 方法相同. Boolean为Boo ...
- 阿里云搭建香港代理服务器 shadownsocks
阿里云香港代理服务器搭建方式: 1.阿里云官网购买轻量级服务器即可,流量,配置套餐自己选择,CENTOS7,进入控制台后打开端口管理列表,打开9000即可. 2.安装shadownsocks服务端: ...
- Zookeeper3.4.14集群搭建
环境: 3台centos7.4 1. 下载release:wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3. ...
- Codeforces Round #420 (Div. 2) - C
题目链接:http://codeforces.com/contest/821/problem/C 题意:起初有一个栈,给定2*n个命令,其中n个命令是往栈加入元素,另外n个命令是从栈中取出元素.你可以 ...
- BZOJ3622 已经没有什么好害怕的了 二项式反演+DP
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3622 题解 首先显然如果 \(n - k\) 为奇数那么就是无解.否则的话,"糖果& ...