记录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
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值