※ 引述《ee55244 (阿一)》之铭言:
: 我手边有一些资料分别是3*3 ~ 13*13不等的二维方阵
: 我需要以方阵中心为起点,找到周围最大值后以顺时针方向将该方阵转为一维的list,
: 例如下列5*5方阵
: 1 2 3 4 5
: 6 7 8 9 10
: 11 12 13 14 15
: 16 17 18 19 20
: 21 22 23 24 25
: 要转成13 19 18 17 12 7 8 9 14 20 25 24 23 22 21 16 11 6 1 2 3 4 5 10 15
对这题目有点兴趣, 但原题叙述有点模糊.
反正是练习, 就改题目写写看.
以下是每层都找最大值为开头, 有重复就随意.
.. 题外话, 变量不知道取啥好, 所以就乱写了~
.. code:: python
"""
>>> M = [[1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5]]
>>> print (f(M))
[3, 9, 4, 9, 8, 7, 2, 7, 8, 6, 1, 6, 1, 2, 3, 4, 5, 0, 5, 0, 5, 4, 3, 2, 1]
"""
def f(M):
if len(M)==1:
return M[0]
else:
L = M[0] + [row[-1] for row in M[1:-1]] + \
M[-1][::-1] + [row[0] for row in M[-2:0:-1]]
head = L.index(max(L))
return f([row[1:-1] for row in M[1:-1]]) + \
L[head:] + L[:head]
原题以由内往外数第二层的最大值为起点, 但未叙述与下一层起点的关系.
从范例看来, 下一圈的起点可能是与上一圈 "平行" 的点, 但这会有含糊的地方:
范例中, 上一圈的起点为 B, 下一圈的起点为 D::
[ _ , _ , _ , _ , _ ]
[ _ , _ , _ , _ , _ ]
[ _ , _ , A , C , _ ]
[ _ , _ , _ , B , D ]
[ _ , _ , _ , _ , _ ]
但在以下例子, 下一圈的起点就分不出是谁::
[ _ , _ , _ , _ , _ ]
[ _ , _ , _ , _ , _ ]
[ _ , _ , A , _ , _ ]
[ _ , _ , B , C , _ ]
[ _ , _ , ? , ? , ? ]
我想干脆改成, 第一圈确定了起点, 就从矩阵中心往外过第一圈起点延伸, 决定外圈起点::
[ _ , _ , _ , _ , D']
[ _ , _ , _ , B', _ ]
[ D", B", A , _ , _ ]
[ _ , _ , B , _ , _ ]
[ _ , _ , D , _ , _ ]
.. code:: python
"""
>>> M = [[1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5],
... [6,7,8,9,0],
... [1,2,3,4,5]]
>>> print (g(M))
[3, 9, 4, 9, 8, 7, 2, 7, 8, 5, 0, 5, 0, 5, 4, 3, 2, 1, 6, 1, 6, 1, 2, 3, 4]
"""
def g(M):
def h(M):
L = M[0] + [row[-1] for row in M[1:-1]] + \
M[-1][::-1] + [row[0] for row in M[-2:0:-1]]
if len(M)==3:
head = L.index(max(L))
return [M[1][1]] + L[head:] + L[:head] , head
else:
_L , _head = h([row[1:-1] for row in M[1:-1]])
head = len(M)//2 * _head
return _L + L[head:] + L[:head] , _head
return M[0] if len(M)==1 else h(M)[0]