IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2022年_蓝桥杯_省赛_4月23日真题_python_第五题_小蓝对角线找奖品 -> 正文阅读

[数据结构与算法]2022年_蓝桥杯_省赛_4月23日真题_python_第五题_小蓝对角线找奖品

蓝桥杯真题又来了啊,上题目:

题目:有一个N*M的矩阵方格,其中有些方格中有奖品,有些方格中没有奖品。小蓝需要从N*M的矩阵中选择一个正方形区域,如果所选的正方形区域的一条对角线方格中有奖品,,就会获得所选对角线上所有奖品,否则不能获得奖品
当给出N和M的值,及N*M的矩形方格中摆放的奖品情况(0代表方格中没有奖品,1表示方格中有奖品),请你帮助小蓝找出一个正方形区域,能够获得数量最多的奖品,并将奖品数输出
如图,例如:N=5,M=6,奖品情况如下

自己画的,不好看,凑合着看吧

只要选择红线画上的正方形区域,就可以获得最多的4个奖品。

输入描述:第一行输入两个整数N 和 M,N表示矩形的行数,M表示矩阵的列数,两个整数之间一个空格隔开,接下来输入N行,每行包括M个0或者1,0或1之间一个空格隔开

输出描述:输出一个整数,表示最多可以获得的奖品数。

解析:这题直接暴力解,一共可以分为几个大块,第一、输入,第二、对角线遍历(可以考虑用函数)第三、输出结果

代码:第一种(非常好理解,但有点长)

n=input()  # 输入行和列
N=int(n[0])  # 行就是第一个
M=int(n[2])  # 去掉空格来算,列是第三个
s=[]  # 创建一个列表,里面要装所有的格子
d=0  # 输出结果(最长奖品对角线)
for i in range(N):  # 搞N行的输入框
    c=input()[::2]  # 去掉空格
    c=[int(i) for i in c]  # 转成数字
    s.append(c)  # 装进大列表里
def find_left(i,j,s):  #  进行左对角线寻找 i是行数索引号,j是列数索引号
    global N  # 把N搞成全局变量,要用一下它
    h=1  # 对角线奖品数
    if s[i][j] == 1:  # 看看第一个是不是有礼物
        while j > 0 and i<N-1:  # 循环,达到对角线遍历的效果。j要注意不要等于零(后面j-1时会超出遍历范围)。i同理
 #                 N要变成索引号得-1 
            i+=1  # 往下一列
            j-=1  # 往左一格
            if s[i][j] == 1:  # 如果有礼物
                h+=1  # 对角线奖品数+1
        return h  # 最终返回对角线奖品数量
            
    else:  # 如果第一个就没有奖品 就没有遍历的价值了
        return 0;  # 直接返回0
def find_right(i,j,s):  #  进行右对角线寻找 和左对角线寻找方法一模一样
    global N,M  # 这回M也要用用
    h=1
    if s[i][j] == 1:
        while j < M-1 and i<N-1: # M-1的道理和N-1的一样
            i+=1
            j+=1  # 往右一格
            if s[i][j] == 1:
                h+=1
        return h
            
    else:
        return 0;
for i in range(N):  # i是行索引号
    for j in range(M):  # j是列索引号
        e=find_left(i,j,s)  # 左边找找
        f=find_right(i,j,s)  # 右边也找找
        d=e if e>d else f if f>d else d  # 这里运用了一个三目运算符
#  返回e 得满足e>d。要不就是f 得满足f>d。都不是返回d 
print(d)

这里面有两个小难点,第一是 i 和 j 的取值 ,我们在日常做题中也会遇到这种,这里给出的建议就是把自己当成电脑,一行一行自己搞一遍。第二是python里的三元运算符,有点难理解,按照注释一点一点推,会懂的。

代码第二种:采用递归算法

q=input()  #  输入两个数 空格隔开
n=q[0]   # 行数
N=int(n)  # 转成整数
m=q[2]   # 列数
M=int(m)
l1=[]   # 保存二维列表 就是题中N*M格子
l=[]    #  保存每次查找到的对角线上的奖品的个数


for i in range(N):   # 遍历行
    a = list(map(int, input().split(" ")))  # 输入每行的奖品(1有奖 0无奖)
    l1.append(a)  # 整行保存到列表中

def find_l(l,x,y):   # 从左到右查找奖品
    global s
    if l[x][y] == 1:  # 判断是否有奖
        s += 1        #  有奖就记上 
        x += 1   
        y += 1    # x,y 理解成坐标 方便下面的移动位置
        if x <= 4 and y <= 5:  # 判断是否在列表范围内
            find_l(l,x,y)  # 是! 就继续找
    else:  
        return s     # 递归的终止条件  返回找到的奖品本次数量

def find_r(l,x,y):   #  从右侧往左侧找
    global s1
    if l[x][y] == 1:
        s1 += 1
        x += 1
        y -= 1
        if x <= 4 and 1 < y <= 5:
            find_l(l,x,y)
    else:
        return s1


for i in range(N):           
    for j in range(M):  # 整个矩形格子里的每一个小格子 预备好被查找
        s = 0
        s1=0
        find_l(l1,i,j)      # 从左到右找
        l.append(s)         #  找到的数量 保存到列表里
        find_r(l1, i, j)    # 从右到左找
        l.append(s1)        #  找到的数量 保存到列表里
print(max(l))   #  打印出找到最长那条线上的奖品数

好啦,就到这里,有什么疑问尽管评论区找我,下期分享更多蓝桥杯真题。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:31:56  更:2022-04-27 11:34:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:42:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码