微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查网格中对角线相邻数字的最大乘积

如何解决检查网格中对角线相邻数字的最大乘积

正如标题中提到的,我试图找到网格中对角相邻数字的最大乘积,但不使用 numpy 库。

dataa = [
    [1,2,3,4,5],[1,[2,5,6],[5,6,8,9,10],5]
]


def search_dr(data,length): # length = how many adjacent numbers to check
    result,size = 0,len(data[0])
    for i in range(size):
        for y in range(0,len(data) - (length - 1)):
            part,counter = [],0
            while len(part) < length:
                if size >= i + (length - 1): # for downward diagonal
                    part.append(data[y + counter][i + counter])
                    counter += 1
                product = 1
                for x in part:
                    product *= x
                if product > result:
                    result = product
                if length - 1 <= i: # for upward diagonal
                    part.append(data[y + counter][i - counter])
                    counter += 1
                product = 1
                for x in part:
                    product *= x
                if product > result:
                    result = product
    return result


search_dr(dataa,4)

预期输出为 480,因为它是 5 * 4 * 4 * 6 个相邻数字的结果,并且它们的乘积将是样本网格中其他 4 个相邻数字中最大的乘积。

但我不明白为什么它不起作用,并且在大多数情况下它会给出索引错误。 如果有人能帮助我理解我的代码问题,我将不胜感激。

主要样本:

   [8,22,97,38,15,00,40,75,7,78,52,12,50,77,91,8],[49,49,99,17,81,18,57,60,87,98,43,69,48,56,62,00],[81,31,73,55,79,14,29,93,71,67,53,88,30,13,36,65],[52,70,95,23,11,42,24,68,1,32,37,91],[22,16,51,63,89,41,92,54,28,66,33,80],[24,47,45,44,84,20,35,50],[32,64,10,26,59,70],[67,94,39,21],58,96,83,34,72],[21,76,61,95],[78,80,92],[16,85,57],[86,21,58],[19,86,40],[4,27,66],[88,72,46,69],25,36],[20,82,74,16],90,54],19,48]

预期输出:70600674 [89,87]

解决方法

您应该采用更简单的方法,只处理属于 4 值对角线的位置。这可以通过识别包含左上角项的矩阵子集并从这些项下移 4 个位置来获得。

例如:

data = [
    [1,2,3,4,5],[1,[2,5,6],[5,6,8,9,10],5]]

result  = 0
values  = []
diagLen = 4
for diagDir in (1,-1):
    for r in range(len(data)-diagLen+1):
        for c in range(len(data[0])-diagLen+1):
            if diagDir<0 : c = len(data[0])-1-c
            prod = 1
            for i in range(diagLen): prod *= data[r+i][c+i*diagDir]
            if prod<result: continue
            result = prod
            values = [data[r+i][c+i*diagDir] for i in range(diagLen)]

print(result,values)
# 480 [5,6]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。