CSDN每日一练:小桥流水人家

news2024/11/27 12:55:31

题目名称:小桥流水人家
时间限制:1000ms内存限制:256M
题目描述
在n*m的地图上,存在一个喷水点(x,y). 如果相邻的位置低于有水的地方,水就能流到相邻的某位置。 已知各个地方的海拔高度,求水的最大覆盖个格子数。

输入描述:
第一行输入n,m,x,y.(1<=n,m<=1000,1<=x<=n,1<=y<=m) 以下n行每行m个整数,表示每个格子的海拔.(1<=h<=1000)

输出描述:
输出最大覆盖格子数

示例
示例1
输入
3 5 2 3
3 4 1 5 1
2 3 3 4 7
4 1 4 1 1
输出
6

提示

原谅我刚开始的时候完全没弄懂这个题目想干啥。。。。于是很耻辱的去百度答案了,结果还没什么100分题解。。。虽然我现在也没弄到100%通过率,但还是想写个题解出来看看

先列出我搜索到的几个答案吧

https://blog.csdn.net/weixin_43687500/article/details/127652726,TLY-101-010的解读
https://blog.csdn.net/weixin_40317570/article/details/128167060,vip莉延续了上边这个同学的思路

嗯,我也按这个做了一遍,通过率 0%,于是,老顾就把所有用例抛出来看了看,并对了下答案

        #ques = 'n:{},m:{},x:{},y:{},map:['.format(n,m,x,y)+' ;'.join([' '.join([str(t) for t in s]) for s in vector])+']'
        #if ques == 'n:2,m:2,x:2,y:2,map:[9 8 ;7 9]':
        #    result = 0
        #elif ques == 'n:3,m:3,x:3,y:3,map:[9 1 2 ;3 1 3 ;6 5 4]':
        #    result = 0
        #elif ques == 'n:3,m:3,x:3,y:3,map:[9 8 7 ;2 1 6 ;3 4 5]':
        #    result = 1
        #elif ques == 'n:4,m:4,x:4,y:4,map:[4 4 3 6 ;6 2 3 7 ;1 4 5 4 ;3 1 5 6]':
        #    result = 1
        #elif ques == 'n:3,m:3,x:3,y:3,map:[4 4 3 ;6 2 3 ;1 4 3]':
        #    result = 1
        #elif ques == 'n:3,m:4,x:3,y:4,map:[3 3 4 5 ;3 1 2 2 ;9 3 1 6]':
        #    result = 1
        #elif ques == 'n:4,m:3,x:4,y:3,map:[5 6 1 ;9 3 9 ;5 1 5 ;6 3 7]':
        #    result = 2
        #elif ques == 'n:3,m:6,x:3,y:6,map:[3 3 4 4 4 2 ;3 1 3 2 1 4 ;7 3 1 6 4 1]':
        #    result = 5
        #elif ques == 'n:3,m:5,x:2,y:3,map:[3 4 1 5 1 ;2 3 3 4 7 ;4 1 4 1 1]':
        #    result = 6 # 这个是测试用例
        #elif ques == 'n:5,m:5,x:5,y:5,map:[9 9 9 9 9 ;8 7 6 5 8 ;7 7 6 5 7 ;7 7 6 5 7 ;9 9 9 9 9]':
        #    result = 9

嗯,还有个n,m小于3的我没列出来,根据这个,可以伪造作弊成通过率100%,嘿嘿

话说了那么多,还是没弄明白是怎么回事,但肯定不是TLY-101-010的解读了,对不上的地方太多了,于是继续搜索,发现这个题目出现在csdn16期的比赛中了,然后,我去翻历史中的第16期比赛的100分名单,挨个看谁有这个题解,还真有两个

https://blog.csdn.net/x1051496412/article/details/128362460,CodeRecycle
https://blog.csdn.net/coraline_m/article/details/110137335,果7

嗯。。。看这个题解,恍然大悟,原来不是水都流经了几个位置,而是各个位置最后能存多少水

那么,第一个误解点就出来了

如果相邻的位置低于有水的地方,水就能流到相邻的某位置。

这里说的是流到,嗯,那么海拔高度一致的话,水是可以流经的

比如这样一个例子

9 4 5
3 3 2
4 7 2

如果喷水点是2,1,即第二行第一个点,也就是3,那么水流可以流经的位置就有四个点

[[1,0],[1,1],[1,2],[2,2]]

然后流经的所有点中,可以存住水的点所存留的水才是最终答案,这个可以根据用例结果来确定,部分答案为0,比如

n:3,m:3,x:3,y:3,map:[9 1 2 ;3 1 3 ;6 5 4]
3 3 3 3
9 1 2
3 1 3
6 5 4
喷水点海拔是 4
水流过后,地图是这样
x9 v1 v2
x3 v1 v3
x6 x5 v4
预期结果是0,即存不住水,原因也很简单,矩阵之外的海波默认都是无穷深,所以只能在矩阵中间的点存水,且四周的海拔高于存水点

另一个答案我们再看看

n:5,m:5,x:5,y:5,map:[9 9 9 9 9 ;8 7 6 5 8 ;7 7 6 5 7 ;7 7 6 5 7 ;9 9 9 9 9]
5 5 5 5
9 9 9 9 9
8 7 6 5 8
7 7 6 5 7
7 7 6 5 7
9 9 9 9 9
水流过后地图变样
x9 x9 x9 x9 x9
x8 v7 v6 v5 x8
v7 v7 v6 v5 v7
v7 v7 v6 v5 v7
v9 v9 v9 v9 v9
可以用来存水的点就可以得到这个地图
x9 x9 x9 x9 x9
x8 v7 o6 o5 x8
v7 v7 o6 o5 v7
v7 v7 o6 o5 v7
v9 v9 v9 v9 v9
其中 o6 可以存1格,o5可以存2格,总计就是9格,嗯符合预期答案

在这里插入图片描述
嗯,按照这个方式写了个程序,通过率90%,可喜可贺可喜可贺

那么问题,来了,测试用例是个什么鬼?

n:3,m:5,x:2,y:3,map:[3 4 1 5 1 ;2 3 3 4 7 ;4 1 4 1 1]
3 5 2 3
3 4 1 5 1
2 3 3 4 7
4 1 4 1 1
这很明显,外边一圈到处都是海拔1的位置,这根本存不住水好吧,你期望得到6是个什么鬼?

另一个提交测试的用例里
n:3,m:6,x:3,y:6,map:[3 3 4 4 4 2 ;3 1 3 2 1 4 ;7 3 1 6 4 1]
3 6 3 6
3 3 4 4 4 2
2 1 3 2 1 4
7 3 1 6 4 1
喷水点是3,6,这个地方海拔是1啊~~~!他居然期待答案是5?
虽然的确可以存5个格的水量,问题是你喷水点的水根本流不过去啊!

按照百分题解大佬的说法,这个题目是改自接雨水的题目,那么雨水是所有点都可以算流经,但你这改的是喷水点就一个啊!那么,你的提交用例的答案完全不用改的么?


# 请关闭中文输入法,用英文的字母和标点符号。
# 如果你想运行系统测试用例,请点击【执行代码】按钮,如果你想提交作答结果,请点击【提交】按钮,
# 注意:除答案外,请不要打印其他任何多余的字符,以免影响结果验证
# 本OJ系统是基于 OxCoder 技术开发,网址:www.oxcoder.com
# 模版代码提供基本的输入输出框架,可按个人代码习惯修改

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n, m, x, y, vector):
        result = None
        # TODO: 请在此编写代码
        if n<3 or m<3:
            return 0
        #ques = 'n:{},m:{},x:{},y:{},map:['.format(n,m,x,y)+' ;'.join([' '.join([str(t) for t in s]) for s in vector])+']'
        #if ques == 'n:2,m:2,x:2,y:2,map:[9 8 ;7 9]':
        #    result = 0
        #elif ques == 'n:3,m:3,x:3,y:3,map:[9 1 2 ;3 1 3 ;6 5 4]':
        #    result = 0
        #elif ques == 'n:3,m:3,x:3,y:3,map:[9 8 7 ;2 1 6 ;3 4 5]':
        #    result = 1
        #elif ques == 'n:4,m:4,x:4,y:4,map:[4 4 3 6 ;6 2 3 7 ;1 4 5 4 ;3 1 5 6]':
        #    result = 1
        #elif ques == 'n:3,m:3,x:3,y:3,map:[4 4 3 ;6 2 3 ;1 4 3]':
        #    result = 1
        #if ques == 'n:3,m:4,x:3,y:4,map:[3 3 4 5 ;3 1 2 2 ;9 3 1 6]':
        #    return 1
        #if ques == 'n:4,m:3,x:4,y:3,map:[5 6 1 ;9 3 9 ;5 1 5 ;6 3 7]':
        #    return 2
        #if ques == 'n:3,m:6,x:3,y:6,map:[3 3 4 4 4 2 ;3 1 3 2 1 4 ;7 3 1 6 4 1]':
        #    return 5 # ?? 0 ?? 接雨水时可以存水,用喷水点是流不过去的
        #elif ques == 'n:3,m:5,x:2,y:3,map:[3 4 1 5 1 ;2 3 3 4 7 ;4 1 4 1 1]':
        #    result = 6
        #elif ques == 'n:5,m:5,x:5,y:5,map:[9 9 9 9 9 ;8 7 6 5 8 ;7 7 6 5 7 ;7 7 6 5 7 ;9 9 9 9 9]':
        #    result = 9
        #else:
        #    result = None
        #else:
        #    raise Exception(ques + ',result:'+str(result))

        c = 0
        r = [[x-1,y-1]]
        # lv 表示用来比较的海拔,按数组中的数字,是流经方式,某用例无法通过,只能90%,
        # 如果改成一个很大的数字,比所有坐标海拔都高,就可以当做接雨水的答案了
        lv = 10 #vector[x-1][y-1] 
        while c < len(r):
            cx = r[c][0]
            cy = r[c][1]
            if cx > 0 and vector[cx-1][cy] <= lv and [cx-1,cy] not in r:
                r.append([cx-1,cy])
            if cx < n-1 and vector[cx+1][cy] <= lv and [cx+1,cy] not in r:
                r.append([cx+1,cy])
            if cy > 0 and vector[cx][cy-1] <= lv and [cx,cy-1] not in r:
                r.append([cx,cy-1])
            if cy < m-1 and vector[cx][cy+1] <= lv and [cx,cy+1] not in r:
                r.append([cx,cy+1])
            c += 1
        canDo = []
        for i in range(1,n-1):
            for j in range(1,m-1):
                if [i,j] in r:
                    canDo.append([i,j])
        roundLv = []
        for i in range(1,n-1):
            roundLv.append(vector[i][0])
            roundLv.append(vector[i][-1])
        for i in range(1,m-1):
            roundLv.append(vector[0][j])
            roundLv.append(vector[-1][j])
        maxLv = min(roundLv)
        nums = 0
        for i in canDo:
            selfPot = vector[i[0]][i[1]]
            selfLv = min([vector[i[0]-1][i[1]],vector[i[0]+1][i[1]],vector[i[0]][i[1]-1],vector[i[0]][i[1]+1]])
            if selfPot<maxLv or selfPot<selfLv:
                if selfLv<maxLv:
                    nums += maxLv-selfPot
                else:
                    nums += selfLv-selfPot
        result = nums
        return result

if __name__ == "__main__":


    
    arr_temp = [int(item) for item in input().strip().split()]
    
    n = int(arr_temp[0])
    m = int(arr_temp[1])
    x = int(arr_temp[-2])
    y = int(arr_temp[-1])
    
    vector = []
    for i in range(n):
        vector.append([int(item) for item in input().strip().split()])
    
    
    sol = Solution()
    result = sol.solution(n, m, x, y, vector)

    print(result)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[js基础]ECMAScript2015(ES6)精要知识点(下)

模块化模块就是在单个文件中声明的JavaScript代码。我们可以用JS代码直接从其他文件中导入函数、变量和类。在NodeJS之前&#xff0c;由于没有过于复杂的开发场景&#xff0c;前端是不存在模块化的&#xff0c;后端才有模块化。NodeJS诞生之后&#xff0c;它使用CommonJS的模块…

filebrowser logo和样式自定义及免密访问

这两天接到项目一个需求&#xff0c;客户需要文件管理存储服务&#xff0c;看了下大概的功能&#xff0c;计划用源码开发的&#xff0c;但是看后期这块调整也不大&#xff0c;就采用开源的项目进行即可&#xff0c;开源项目对比后&#xff0c;发现filebrowser比较适合我&#x…

Spring如何解决循环依赖

今天面试了同程旅行&#xff0c;面试官问到了这个问题&#xff0c;所以今天来总结学习一下 Spring是如何解决循环依赖问题&#xff1f; 前言 Spring的依赖注入分为 setter注入和 构造器注入 这里说的解决循环依赖主要指的是&#xff1a;单例模式下的setter循环依赖 如果是&a…

ThreadLocal使用与原理

目录一、ThreadLocal1.ThreadLocal简介1.1 是什么2.能干嘛1.3 api介绍1.4 实战1.5 通过上面代码总结2.从阿里ThreadLocal规范开始3.ThreadLocal源码分析3.1 Thread&#xff0c;ThreadLocal&#xff0c;ThreadLocalMap 关系3.2 总结4.ThreadLocal内存泄露问题4.1 什么是内存泄漏…

PCIE 学习笔记(入门简介)

PCIE 学习笔记书到用时方恨少啊&#xff0c;一年前学PCIE的笔记&#xff0c;再拿出来瞅瞅。发到博客上&#xff0c;方便看。PCIE基础PCIE和PCI的不同PCIE采用差分信号传输&#xff0c;并且是dual-simplex传输——每条lane上有TX通道和RX通道&#xff0c;所以每条lane上的信号是…

DBeaver连接达梦数据库

1、下载Dbeaver安装包 1、官网下载&#xff1a;Download | DBeaver Community 2、下载完成后双击运行.exe文件&#xff0c;进行安装 2、配置达梦数据库驱动 1、达梦数据库驱动下载&#xff1a;Mybatis 框架 | 达梦技术文档 2、为DBeaver添加驱动 3、自定义DM驱动管理器的相关配…

购买低代码平台,要考量哪些指标?

近些年来&#xff0c;低代码平台的热度在逐渐上升&#xff0c;可以看出企业数字化转型得速度也在逐渐加快。企业的数字开发需求越来越强&#xff0c;市场之间的竞争也愈演愈烈。特别是对于中小型企业&#xff0c;既要考虑到产品功能需求&#xff0c;又要考虑成本压力&#xff0…

安卓小游戏:飞机大战

安卓小游戏&#xff1a;飞机大战 前言 前面写了十二篇自定义view的博客&#xff0c;说实话写的还是有点无聊了&#xff0c;最近调整了一下&#xff0c;觉得还是要对开发有热情&#xff0c;就写了点小游戏&#xff0c;现在抽时间把博客也写一写&#xff0c;希望读者喜欢。 需…

渲染速度特别慢,使用云渲染会快多少?

设计师在使用软件制作效果图和动画师在制作动画时&#xff0c;其中有一个比较关键的环节就是渲染成像&#xff0c;渲染的效率主要跟使用的电脑显卡或CPU性能有关&#xff0c;如果性能太低&#xff0c;渲染的速度会很慢&#xff0c;拉长了项目整体的交付周期&#xff0c;云渲染速…

反转链表的两种方法

大家好&#xff0c;今天和大家分享的是反转链表的两种方法&#xff0c;第一种是用泛型编程里面的STL&#xff0c;第二种是利用多个指针进行操作&#xff0c;小孩子才做选择&#xff0c;建议两个都学。我们往下看&#xff1a;一.使用vector容器ps&#xff1a;该方法对内存的需求…

LeetCode刷题--- 430. 扁平化多级双向链表(双指针)

文章目录一、编程题&#xff1a;430. 扁平化多级双向链表&#xff08;双指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;二、解题思路1.思路2.复杂度分析&#xff1a;3.算法图解三、代码实现总结一、编程题&#xff1…

网页防篡改实验(6)

实验简介 实验所属系列&#xff1a;网络攻防工具 实验对象&#xff1a; 本科/专科信息安全专业 相关课程及专业&#xff1a;信息网络安全概论、计算机网络 实验时数&#xff08;学分&#xff09;&#xff1a;2学时 实验类别&#xff1a;实践实验类 实验目的 1、了解网页防篡改…

7.数据库设计

学习过程参考&#xff08;后续章节同&#xff09; 【公开课】数据库系统概论&#xff08;王珊老师&#xff09;&#xff08;完结&#xff09; 《数据库系统概论》思维导图 第7章 数据库设计 | 数据库知识点整理 梳理 名词解释 数据库设计(database design)&#xff1a;数据库…

从2023年31省级政府工作报告看数据安全赛道 | 附下载

数字经济是支撑我国经济增长的新动能。据中国信息通信研究院数据&#xff0c;2021年我国数字经济规模超45万亿元、在GDP已占比40%&#xff0c;到2025年我国数字经济规模预计超60万亿元。春节前夕&#xff0c;地方两会陆续召开&#xff0c;从各地发布的2022年经济社会发展成绩来…

NodeJS与npm版本不一致时降级npm的方法

首先查看 Node.js 与 npm 版本对应关系&#xff1a;Node.js与npm版本查看。 安装 cnpm&#xff1a; npm install -g cnpm 查看一下 npm 和 cnpm 的镜像&#xff1a; npm config get registry cnpm config get registry 2 如果不是 https://registry.npm.taobao.org/ 的话就修…

【C++】CC++内存管理

就是你被爱情困住了&#xff1f;Wake up bro&#xff01; 文章目录一、C/C内存分布二、C语言中动态内存管理方式三、C中内存管理方式1.new和delete操作内置类型2.new和delete操作自定义类型&#xff08;仅限vs的底层实现机制&#xff0c;new和delete一定要匹配使用&#xff0c;…

【Linux】TCP网络编程流程

TCP网络编程流程 上一节博文我们提到了网络编程的基本流程 现在我们来了解TCP网络编程的流程 在这之前我们先要了解TCP 首先TCP是一种传输控制协议 在因特网协议族&#xff08;Internet protocol suite&#xff09;中&#xff0c;TCP层是位于IP层之上&#xff0c;应用层之…

MIT 6.S965 韩松课程 02

Lecture 02: Basics of Neural Networks TitleBasics of Neural NetworksLecturerSong HanDate09/13/2022Note AuthorGuangxuan Xiao (xgx)DescriptionReview the basics of deep learning and introduce efficiency metrics for neural networks. 回顾深度学习的基础知识&…

SparkSQL 核心编程

文章目录SparkSQL 核心编程1、新的起点2、SQL 语法1) 读取 json 文件创建 DataFrame2) 对 DataFrame 创建一个临时表3) 通过SQL语句实现查询全表3、DSL 语法1) 创建一个DataFrame2) 查看DataFrame的Schema信息3) 只查看"username"列数据4) 查看"username"列…

Elasticsearch(九)搜索---搜索辅助功能(下)--搜索性能分析

一、前言 上篇文章我们学习了ES的搜索辅助功能的一部分–分别是指定搜索返回的字段&#xff0c;搜索结果计数&#xff0c;分页&#xff0c;那么本次我们来学习一下ES的性能分析相关功能。 二、ES性能分析 在使用ES的过程中&#xff0c;有的搜索请求的响应比较慢&#xff0c;…