矩阵的螺旋排列 Python实现

来源:互联网 发布:ubuntu看存储空间 编辑:程序博客网 时间:2024/05/22 12:16

矩阵的螺旋排列

 

描述

以二维列表方式给定一个M*N的矩阵(M行,N列),以螺旋的顺序返回矩阵所有元素,并按照列表形式输出,各元素以逗号为间隔。

例如,给定矩阵如下:

[

 [ 1,  2,  3 ],

 [ 4,  5,  6 ],

 [ 7,  8,  9 ]

]

那么按照螺旋形状应该返回 [1,2,3,6,9,8,7,4,5]

程序的框架参考如下:


def SpiralOrder(matrix):    ...matrix = eval(input())res = SpiralOrder(matrix)print(res)

 


输入

示例1:[[1,2,3],[4,5,6],[7,8,9]]

 


输出

示例2:[1, 2, 3, 6, 9, 8, 7, 4, 5]

 一开始当成输入为方阵了,写成了下面这样


def GenerateMatrix(l):           length = len(l)           dx, dy = [0,1,0,-1], [1,0,-1,0]           res, step, x, y, num= [[0]* length for i in range(length)], length-1,  0, 0, 1           while step>0:                      for i in range(4):                                 for j in range(step):                                            res[int(x)][int(y)] = int(num)                                            x, y, num=x+dx[i],y+dy[i],num+1                      step-=2                      x,y = (length-step)/2, (length-step)/2           if step==0: res[int(x)][int(y)]=int(num)           return  resl=eval(input())ans=GenerateMatrix(l)print(ans)

没有用到给定矩阵,如果不是等差且差值为1就不对了,况且输入还有不是方阵的

但这种简化的写法(将方向做成下标变换的数组)和一开始的赋值方式还是很有借鉴意义的

[[0]* length for i in range(length)]



附上修改的代码,不断往列表里Append

def GenerateMatrix(l):           length = len(l)           dx, dy = [0,1,0,-1], [1,0,-1,0]           res=[]           step, x, y= length-1,  0, 0           try:                      while step>0:                                 for i in range(4):                                            for j in range(step):                                                       res.append(l[int(x)][int(y)])                                                       x, y=x+dx[i],y+dy[i]                                 step-=2                                 x,y = (length-step)/2, (length-step)/2                      if step==0: res.append(l[int(x)][int(y)])                      return  res           except:                      return resl=eval(input())ans=GenerateMatrix(l)print(ans)



然后上课看到这种写法,很精妙,通过列表反转解决了很多问题,不再需要做四次循环还要设置循环变量,也不再用判断奇数偶数导致的最后一个的赋值需要判断,实在是太完美了

m=eval(input())ans=[]try:           while True:                      ans+=m.pop(0)                      for l in m:                                 ans.append(l.pop())    '''将每一行的最后一个元素加到列表里'''                      ans+=m.pop()[::-1]                '''将最后一行反转后加入列表'''                       for l in m[::-1]:                  '''将剩余的行反转,将每一行的第一个加入'''                                   ans.append(l.pop(0))except:           print(ans)



原创粉丝点击