作者: 
apua (Apua)   
2014-09-12 21:36:54※ 引述《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]