首页 > 试题广场 >

蛇形矩阵

[编程题]蛇形矩阵
  • 热度指数:169519 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

例如,当输入5时,应该输出的三角形为:

1 3 6 10 15

2 5 9 14

4 8 13

7 12

11



输入描述:

输入正整数N(N不大于100)



输出描述:

输出一个N行的蛇形矩阵。

示例1

输入

4

输出

1 3 6 10
2 5 9
4 8
7

下面代码的思路是,观察每行和每列的规律,然后按行进行输出

初始化了两个 list,两个list 
list_gap_x,表示行元素相邻两两之间的差值
list_gap_y,表示列元素,第一个位置,相邻两两之间的差值

list_gap_y 用来确定每行第一个元素是什么,list_gap_x 用来计算每行后续的元素是什么

n = 4时,
输出为:
1 3 6 10
2 5 9
4 8
7
list_gap_x 为
2 3 4
3 4
4
list_gap_y 为
1
2
3

前面初始化的这段代码,放在不同位置,有不同的结果
不知道为啥,求解答
n = int(input())
value_x = 1
value_y = 1
list_gap_x = list(range(2, n+1))
list_gap_y = list(range(n+1))

# 前面初始化的这段代码,放在不同位置,有不同的结果
# 不知道为啥,求解答

# 1. 放在 while True 下面,会有如下报错
# 程序异常退出, 请检查代码"是否有数组越界等异常"或者"是否有语法错误"
# Traceback (most recent call last):
# File "/tmp/a.py3", line 10, in
# n = int(input())
# EOFError: EOF when reading a line

# 2. 放在 try 下面 会在某一行中断循环,只跑了一部分的蛇形矩阵

# 3. 放在目前最上面的位置,才可以跑通

# 4. 当前代码,去掉 while True, 去掉 try except,
# 在自测 n = 4 的时候,需要取消注释 # print(value_x),才能跑通 n = 4
# 在提交的时候,会 出现 2. 的问题,只跑出一部分蛇形矩阵

n = int(input())
value_x = 1
value_y = 1
list_gap_x = list(range(2, n+1))
list_gap_y = list(range(n+1))

while True:
    try:
        for gap_y in list_gap_y:
            for gap_x in list_gap_x:
                print(value_x, end=" ")
                value_x += gap_x
            print(value_x)
            list_gap_x.pop(0)
            list_gap_y.pop(0)
            value_x = value_y + list_gap_y[0]
            value_y = value_x
        # print(value_x)
    except:
        break

编辑于 2022-12-16 12:29:50 回复(0)
n = int(input())
#第一行第一列的值
col = 1
#此循环是有多少行
for i in range(n):
    #每一轮循环开始,设置第一个数字
    col += i
    row = col
    #此循环是当前行有多少列
    for j in range(n-i):
        print(row,end=' ')
        #更新为下一个应该打印出来的数字,2+i是每一行控制起始间隔步长的
        #第一行第一个数字加2(2+0)的到第二个数字
        #第二行第一个数字加3(2+1)得到第二个数字
        #...
        row += (2+i)+j
    #每一行打印完了输出回车换行,开始下一轮循环打印下一行
    print()
    

发表于 2022-04-17 11:17:13 回复(0)
import sys


def func(num):
    res = [[0 for i in range(num)] for j in range(num)]
    tmp = 1
    for i in range(num):
        for j in range(i+1):
            res[i-j][j] = tmp
            tmp += 1
    for i in res:
        print(' '.join(map(str, (filter(lambda i: i != 0, i)))))

for line in sys.stdin:
    func(int(line))

发表于 2021-05-03 16:39:24 回复(0)
def cal(n):
    start = 1
    for i in range(n):
        start = start + i - 1
        m = start
        v = i + 1
        for j in range(i, n):
            m = m + v
            print(m,end=" ")
            v += 1
        print()
while True:
    try:
        n = int(input())
        cal(n)
    except:
        break
发表于 2021-04-21 11:25:00 回复(0)
while True:
    try:
        dim = int(input())
        tri = {}
        count = 1
        for ii in range(0, dim):   # ii 行下标
            for jj in range(0, ii+1):   # jj 斜坐标
                tri[(ii-jj, jj)] = count
                count += 1
        for row in range(0, dim):
            for col in range(0, dim-row):
                print(str(tri[(row, col)]), end=' ')
            print(end='\n')
    except:
        break
发表于 2021-03-28 14:09:09 回复(0)
第一行是求等差数列前n项和
后面几行是前一行通过删减和各项逐次减一得到
while True:
    try:
        num=int(input())
        list1=[False]*num
        list1[0]=[int(i*(1+i)/2) for i in range(1,num+1)]
        for i in range(1,num):
            list1[i]=[int(list1[0][j]-i) for j in range(i,num)]
        for i in range(num):
            print(' '.join(map(str,list1[i])))
    except:
        break

发表于 2021-03-23 09:32:17 回复(0)
这是一道数学题。

首先要知道矩阵如何输出。一般是一个for循环行,然后每行填入不同的数组
这种矩阵如果用python3输出就是for循环,里面用一个列表res[]

其次观察出每一行是上一行少一个其他数减1,所以第一行求出来其他直接利用第一行得出。
python3中就是res=[e-1 for e in res[1:]]①

其次观察第一行规律,我们程序里面对应的循环都是01234……,这里面第一行是1、3、6、10……
用数列相关知识容易看出a[n+1]-a[n]=n(数组如果从第一项开始)。
将上述等式从2写到n,这n-1项求和即可得出通项公式a[n]=n*(n+1)/2.
python3中就是res=[(e+1)*e for e in range(1,n+1)]②

最后就是一个判断语句衔接起来就好,if i ==1执行②,else执行①

附上代码:(全是参考别人的,仅限于看懂,不是原创)
 

编辑于 2021-02-09 11:41:24 回复(0)
def start_num(row):
    res = 1
    for i in range(1,row + 1):
        res = res + (i - 1)
    return res

def print_row(row,count):
    start = start_num(row)
    for i in range(1,count+1):
        print(start,end=" ")
        start = start + i + row
while True:
    try:
        row = int(input())
        for i in range(1,row + 1):
            print_row(i, row + 1 - i)
            print()
    except:
        break

发表于 2021-01-07 16:42:01 回复(0)
while True:
    try:
        n = int(input())
        triList = []
        count = 1
        for i in range(n,0,-1):
            empty = ["" for i in range(i)]
            triList.append(empty)
        for i in range(n+1):
            for y in range(i):
                x = i - y - 1
                triList[x][y] = str(count)
                count += 1
        res = ""
        for i in range(n):
            print(' '.join(triList[i]))
    except:
        break


编辑于 2021-01-03 20:51:09 回复(0)
while True:
    try:
        n=int(input())
        lst=[]
        for i in range(n):
                lst.append([ii for ii in range(int(i*(i+1)/2+1),int((i+1)*(i+2)/2+1))])
        m=0
        for m in range(n):
            for i in range(m,n):
                print(lst[i][-m-1],end=' ')
            print('')
    except:
        break

发表于 2021-01-03 17:38:40 回复(0)
无辅助存储,直接逐行计算输出
import sys


for n in sys.stdin:
    n = int(n)
    x = 1
    for i in range(n):
        output = ""
        x = x + i
        num = x
        output += str(num)
        for j in range(n+1)[2+i:]:
            num += j
            output += " {}".format(num)
        print(output)


发表于 2020-12-15 22:36:38 回复(0)
while True:
    try:
        num = int(input())
        # start变量记录每行的第一个数值,初始化为1
        start = 1
        for i in range(0, num):  # [1,2,4,7,11]
            start += i
            # 将求出来的每一行中的第一个值赋值给p,由p来继续这行其他数的运算
            p = start
            print(p, end=' ')  # 打印每行的第一个数值
            # 每一行的第一个数值已经打印完成,接着继续这行中其他数值的计算
            for j in range(i+1, num):
                p += (j+1)
                print(p, end=' ')
            print()

    except:
        break

发表于 2020-11-30 12:25:17 回复(1)
# 2020年11月17日11:02:12
# 设列编号m,n均从0开始
# 蛇形矩阵第0列构成递推数列,通项公式为Am,0 = Am-1,0 + m
# 蛇形矩阵每一行构成一个递推数列,
# 第0行为An = An-1 + n + 1
# 第1行为An = An-1 + n + 2
# 第m行为An = An-1 + n + m + 1
# 综上,蛇形矩阵的递推公式为:
# Am,n = Am,n-1 + n + m + 1   (n>0)
# Am,0 = Am-1,0 + m           (n=0,m>0)
# A0,0 = 1                    (n=0,m=0)

#根据行列号查询蛇形矩阵值
def snake(m, n):
    if n==0 and m==0:
        num = 1
    elif n==0:
        num = snake(m-1, 0) + m
    else:
        num = snake(m,n-1) + n + m + 1
    return num

while True:
    try:
        N = int(input())
#       遍历N行
        for i in range(N):
            data = ""
#           在第i行,遍历N-i列
            for j in range(N-i):
                data  += str(snake(i, j))
                if j != N-i-1:
                    data += " "
            print(data)
    except:
        break
        

编辑于 2020-11-17 14:34:22 回复(0)
#对于初学者估计会比较容易理解  看了大神级别的 估计不知道咋回事人家也不解释
#大神级别的 代码估计刚入行的都看不懂咋回事   看着人家溜  跟你们无关 不知道里面的逻辑都是白扯
'''思路:
每行的数是有规律的,以n=4为例,第一行的第一个数是1,第二数是1+2=3,第三个数是3+3 =6,
第四个数是6+4=10,总共加了n-1次分别是range(2,n+1),第二行的第一个数是1+1=2,第二个数是2+3=5,
第三个是5+4=9,总共加了n-2次,分别是range(3,n+1)。第三行第一个数是第二行第一个数加2,2+2 =4,
第二个数是4+4=8,总共加n-3次为range(4,n+1),第四行第一个数是第三行第一个数加3,4+3=7,
第四行没有其他数因为n-4=0。泛化成数字表示,
第i行的第j个数等于第i行的前一个数加list(range(i+1,n+1))[j]。dp[i][j]=dp[i][j-1]+list(range(i+1,n+1))[j]。
我们需要每一行的第一个数,dp[i][1]=dp[i-1][i]+i-1。所以第一行的第一个数必须初始化为1。为了方便迭代,
我们初始化一个dp[0][1]=1,第一行的第一个数是dp[1][1]=dp[0][1]+1-1=1。其他的每个数按迭代方式更新。代码如下:
'''
while True:
    try:
        n = int(input())
        a = 1  # 第一行的数  也是初始化dp[0][1]
        for i in range(1, n+1):#更新第i行的后边的数
            list1 =[]
            a = a+i - 1
            b = a
            list1.append(str(a))
            for i2 in range(i+1,n+1):#更新i+1行的第一个数  为下一轮i+1行数据做准备
                b=b+i2
                list1.append(str(b))
            print(' '.join(list1))
    except:
        break
发表于 2020-10-13 23:47:12 回复(0)
观察发现,数据是向右上角前进的。
while True:
    try:
        n = int(input())
        # 创建二维数组并初始化为0
        arr = [[0 for i in range(j)] for j in range(n, 0, -1)]
        i = j = 0
        arr[i][j] = 1
        while True:
            # 撞墙新起一行
            if i-1 < 0:
                arr[j+1][0] = arr[i][j] + 1
                i = j + 1
                j = 0
            # 没有撞墙向右上角走
            else:
                arr[i-1][j+1] = arr[i][j] + 1
                i = i - 1
                j = j + 1
            if j == n - 1:
                break
        for i in arr:
            print(' '.join(map(str, i)))
    except:
        break
        


发表于 2020-09-27 16:49:43 回复(0)
小白想了一个方法,就是利用不断对矩阵的位置进行依次赋值。遇到某种情况就转变下一次赋值的位置。
while 1:
    try:
        num = int(input())
        snum = (num**2+num)//2 
        x = 0
        y = 0
        array = [[0 for i in range(num)] for j in range(num)]
        for i in range(1,snum+1):
            array[x][y] = str(i)
            if x == 0:
                x = y+1
                y = 0
            else:
                x -= 1
                y += 1  
        for i in range(num):
            b = list(array[i][:num-i])
            print(" ".join(b))
    except:
        break


编辑于 2020-09-02 15:02:30 回复(0)
python
def snakeMat(N): # N 蛇形矩阵行数
    mat = [[0 for j in range(N)] for i in range(N)]
    x = 1
    for index in range(N):
        i = index
        while i >= 0:
            j = index - i
            mat[i][j] = x
            i -= 1
            x += 1
    return mat

while True:
    try:
        N = int(input())
        mat = snakeMat(N)
        for i in mat:
            print(' '.join(str(x) for x in i if x!=0))
    except:
        break


发表于 2020-08-27 12:28:53 回复(0)
while True:
    try:
        n = int(input())
        temp = []
        #先拿第一行存储
        for i in range(n):
            temp.append((i+1)*(i+2)//2)
        #逐行输出
        for i in range(n):
            res = []
            for j in temp[i:]:
                res.append(str(j-i))
            print(' '.join(res))
    except:
        break
发表于 2020-07-19 23:39:24 回复(0)
while True:
    try:        
        num=int(input())
        i=num
        start=1
        setp=0
        k=0
        m=2
        n=0
        for line in range(num):
            step=0
            start+=n
            k=0
            value=start
            for j in range(i):
                value+=step
                if j == i-1:
                    print(value)
                else:
                    print(value,end=" ")
                step=m+k
                k+=1
            n+=1
            m+=1
            i=i-1
    expect:
        break
发表于 2020-06-01 04:41:14 回复(0)
while True:
    try:
        n = int(input())
        res = []
        x = 1
        
        for i in range(n):
            x += i
            list = [x]
            y = 0
            for j in range(i + 2, n + 1):
                y = j + list[-1]
                list.append(y)
            res.append(list)
        
        for i in res:
            for j in i:
                print(j,end=" ")
            print()
    except:
        break

发表于 2020-05-14 11:24:23 回复(1)