题目描述

有一块矩形土地被划分成$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)的更多相关文章

  1. [CSP-S模拟测试]:Star Way To Heaven(最小生成树Prim)

    题目描述 小$w$伤心的走上了$Star\ way\ to\ heaven$. 到天堂的道路是一个笛卡尔坐标系上一个$n\times m$的长方形通道(顶点在$(0,0)$和$(n,m)$),小$w$ ...

  2. 「题解」NOIP模拟测试题解乱写II(36)

    毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...

  3. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  4. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  5. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  6. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  7. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  8. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  9. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

随机推荐

  1. (appium+python)UI自动化_09_unittest批量运行测试用例&生成测试报告

    前言 上篇文章[(appium+python)UI自动化_08_unittest编写测试用例]讲到如何使用unittets编写测试用例,并执行测试文件.接下来讲解下unittest如何批量执行测试文件 ...

  2. 如何创建linux虚拟机

    一.安装配置linux虚拟机 第1步:运行"Vmware WorkStation",看到主页面. 第2步:创建新的虚拟机,新建虚拟机向导——典型(推荐). 第3步:选择稍后安装操作 ...

  3. Linux部署禅道环境

    1.打开WinSCP 2.  输入Linux IP 用户名(root)及密码(123456)并点击保存 3.  点击登录后再输入一次密码 4.把ZenTaoPMS.11.2.stable.zbox_6 ...

  4. CentOS删除Applications中的菜单项

    有时候会错误的安装一些软件,可能安装被不成功,但是在左上角的Applications菜单中还是会显示出来,让人很不爽. 现在介绍一个删除掉CentOS Applications中菜单项的方法: 1.安 ...

  5. CSS选择器,优先级的总结

    CSS选择器 css选择器种类 基本选择器: 通配符选择器 * id选择器 #id 类选择器 .className 元素选择器 E 元素后代选择器  E F 子元素选择器 E > F 相邻兄弟元 ...

  6. KNN算法案例--手写数字识别

    import numpy as np import matplotlib .pyplot as plt import pandas as pd from sklearn.neighbors impor ...

  7. 【接口工具】接口抓包工具之Fiddler

    一.Fiddler的基本功能介绍 Fiddler的官方网站: https://www.telerik.com/purchase/fiddler Fiddler是最强大最好用的Web调试工具之一,它能记 ...

  8. TensorFlow 安装报错的解决办法

    最近关注了几个python相关的公众号,没事随便翻翻,几天前发现了一个人工智能公开课,闲着没事,点击了报名. 几天都没有音信,我本以为像我这种大龄转行的不会被审核通过,没想到昨天来了审核通过的电话,通 ...

  9. redis学习(二)

    简单了解一下 1.build.gradle中添加 依赖  org.springframework.boot:spring-boot-starter-data-redis //定义依赖:声明项目中需要哪 ...

  10. iOS crash log 解析

    iOS开发中,经常遇到App在开发及测试时不会有问题,但是装在别人的设备中会出现各种不定时的莫名的 crash,因为iOS设备会保存应用的大部分的 crash Log,所以可以通过 crash Log ...