题解 | #蛇形矩阵#

蛇形矩阵

http://www.nowcoder.com/practice/649b210ef44446e3b1cd1be6fa4cab5e

while True: try: n = int(input())

    li=[1]
    for i in range(1 , n):
        li.append(li[-1]+i)
    # print(li)
    l = []
    for c, i in enumerate(li,1):
        l.append(i)
        for j in range(c+1 , n+1):
            l.append(l[-1]+j)
        print(' '.join(map(str,l)))
        l=[]

    # lj = [1]
    # for i in range(2, n + 1):
    #     lj.append(lj[-1] + i)
    # print(lj)
except:
    break
全部评论
哈喽,虽然我们现在彼此不认识,但是很高兴认识你 这两天我一直在认真思考这道题的解法,并且多次尝试用代码实现,不过就是卡住,用代码实现总是报错 后来发现是自己找到了递推公式 a[i]=a[i-1] + i + 1 i >= 1 a[0]=1,想直接用递推公式进行代码实现,后来苦想了两天(哭,可惜我不是那种智商贼高,一点就透的人,不仅花了两天时间,而且期间因为做不出来搞的贼痛苦。。)才发现要回到高中数学,用递推公式求通项式: a[i]=a[i-1] + i + 1 a[i]-a[i-1] = i + 1 a[i-1]-a[i-2] = i a[i-2]-a[i-3] = i - 1 . . . a[2]-a[1] = 3 a[1]-a[0] = 2 将以上式子相加得到: a[i]-a[0]= i + 1 + i + i-1 + ... + 3 + 2 因为a[0]=1,所以有: a[i] = i + 1 + i + i-1 + ... + 3 + 2 + 1 或许你和我一样模模糊糊记得高斯小时候如何计算从1到100的和那个小故事: 大约在高斯十岁的时候,老师在算数课上出了一道难题:「把1到100的整数写下来,然后把它们加起来!」高斯的答案上只有一个数字:5050 老师吃了一惊,高斯就解释他如何找到答案:1+100=101,2+99=101,3+98=101,……,49+52=101,50+51=101,一共有50对和为101的数目,所以答案是50×101=5050。 a[i] = i + 1 + i + i-1 + ... + 3 + 2 + 1 中,i + 1 后面的i + i-1 + ... + 3 + 2 + 1 就跟高斯的算法一样,有二分之一 i 对 i+1,再加上前面一个i+1(这里考虑i为奇偶数后,依然是这个结果),就是1/2i+1 对 i + 1, 那么他们的和就是(1/2i+1)* ( i + 1)= (i+2)*(i+1)/2 这样我们就得到了 a[i] =(i+2)*(i+1)/2,也就是第一行的元素的计算公式。 从而我们就能看懂评论区解法中的一种,的核心代码:res=[(e+2)*(e+1)//2 for e in range(N)],其实就是利用我们计算出的公式,来计算第一行的元素。 这个题的第一行计算出来,后面的就简单了,下一行是上一行除去第一个数以后的其它数减1,以此类推,就可以得到整个蛇形矩阵。 代码可以参考: import sys for line in sys.stdin: N=int(line.strip()) res=[] for i in range(N): if i==0: res=[(e+2)*(e+1)//2 for e in range(N)] else: res=[e-1 for e in res[1:]] # print(res) #其实到这里核心代码就结束了 for t in res: print(t,end=" ") print()
1 回复 分享
发布于 2021-11-27 18:27

相关推荐

牛客771574427号:恭喜你,华杰
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务