记录CSDN每日一练问题

题目:小桥流水人家

在n*m的地图上,存在一个喷水点(x,y). 如果相邻的位置低于有水的地方,水就能流到相邻的某位置。 已知各个地方的海拔高度,求水的最大覆盖个格子数。

输入描述:

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

输出描述:

输出最大覆盖格子数

示例

输入:

3 5 2 3
3 4 1 5 1
2 3 3 4 7
4 1 4 1 1

输出:

6

原题代码(未补充完成)

class Solution:
    def __init__(self) -> None:
        pass
    
    def solution(self, n, m, x, y, vector):
        result = None

        # TODO: 请在此编写代码

        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[3])
    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)

解题

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2022/11/2 10:48
# @Author  : TLY
# @Site    : 
# @File    : 地图喷泉.py
# @Software: PyCharm
class Solution:
    def __init__(self) -> None:
        pass

    def changshi(self, vector, matrix, n, m, a, b):
        ll = [[-1, 0], [1, 0], [0, -1], [0, 1]]
        for i in range(4):  # 四边寻找 上下右左
            a1 = a + ll[i][0]
            b1 = b + ll[i][1]
            if 0 <= a1 <= n - 1 and 0 <= b1 <= m - 1:
                if vector[a][b] > vector[a1][b1]:  # 若找到
                    matrix[a1][b1] = 1  # 标记位置
                    self.changshi(vector, matrix, n, m, a1, b1)
        return matrix

    def solution(self, n, m, x, y, vector):
        result = 0
        a, b = n - y, x - 1
        matrix = [[0 for i in range(m)] for i in range(n)]
        matrix[n - y][x - 1] = 1
        matrix = self.changshi(vector, matrix, n, m, a, b)
        for i in range(n):
            for j in range(m):
                if matrix[i][j] == 1:
                    result = result + 1
        print(matrix)
        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[3])
    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)

对示例可以完美输出,但测试用例行不通

运行中...
运行失败:不通过
您的代码已保存。
出现错误,您提交的程序运行出错,请根据以下提示进行修改。
Traceback (most recent call last):
File "Main.py", line 53, in
result = sol.solution(n, m, x, y, vector)
File "Main.py", line 27, in solution
matrix[n - y][x - 1] = 1
IndexError: list index out of range

问题归纳

输入描述中:第一行输入n,m,x,y.(1<=n,m<=1000,1<=x<=n,1<=y<=m) 以下n行每行m个整数,表示每个格子的海拔.(1<=h<=1000)
加粗部分,逻辑上不太对
根据n行每行m个整数,可以得出n行m列的列表,(x,y)是笛卡尔坐标
根据输入:

3 5 2 3 # n m x y
3 4 1 5 1
2 3 3 4 7
4 1 4 1 1

只有第一行的4满足输出:

6

而(x,y)和n m 不是对应关系,
n m坐标

  3 4 1 5 1 # n=1
  2 3 3 4 7 # n=2
  4 1 4 1 1 # n=3
---------------
# 1 2 3 4 5 # m

x y坐标

  3 4 1 5 1 # y=3
  2 3 3 4 7 # y=2
  4 1 4 1 1 # y=1
---------------
# 1 2 3 4 5 # x

所以**(1<=n,m<=1000,1<=x<=n,1<=y<=m)**应该为(1<=n,m<=1000,1<=y<=n,1<=x<=m)
仅个人理解,有错勿喷

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
影分身是一种在忍者世界中常见的特殊技能,也是《火影忍者》中的一个重要元素。每个人都可以通过影分身术创造出许多个分身,这些分身可以同时进行各种活动。类比于影分身术,CSDN每日一练就像是一个模拟的技能训练场。每天CSDN都会发布一道题目供广大程序员参与练习。 参与影分身CSND每日一练的好处有许多。首先,通过每日一练,程序员们可以不断提高自己的编程能力。就像影分身可以通过快速反应和高效操作来增强自己的实力一样,参与每日一练可以锻炼程序员的编程思维和解决问题的能力。 其次,每日一练还可以丰富程序员的知识储备。每道题目都是经过精心挑选和设计的,涵盖了各种常见的编程知识点和技巧。通过解答这些问题,程序员们能够接触到各种新的问题和方法,扩展自己的知识领域。 另外,参与每日一练还可以增强程序员的交流与学习能力。在每道题目下方,CSDN提供了评论区供程序员们交流和讨论。程序员们可以在这里分享自己的解题思路和方法,互相学习和进步。这不仅能够提高解题能力,还能够拓宽视野,了解不同的编程思维和技术。 综上所述,影分身CSND每日一练就像是一个虚拟的技能训练场,可以帮助程序员们不断提升自己的编程能力,丰富知识储备,增强交流与学习能力。参与其中,每个程序员都能像影分身一样变得更加强大。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值