2009-10-31 3 views
4

Я готовлюсь к собеседованию и застрял на этом вопросе в течение довольно долгого времени. Может кто-нибудь, пожалуйста, помогите мне с кодом. Если не полный, то может быть его фрагментом? Пожалуйста ..Перемещение 2D-массива в спиральном узоре с использованием рекурсии

ответ

15

Python 2, печатает 2D вложенный список в направлении по часовой стрелке от верхнего левого угла к центру:

>>> def clockwise(r): 
...  return list(r[0]) + clockwise(list(reversed(zip(*r[1:])))) if r else [] 
... 
>>> a = [ 
... [ 1, 2, 3], 
... [ 5, 6, 7], 
... [ 9, 10, 11]] 
>>> clockwise(a) 
[1, 2, 3, 7, 11, 10, 9, 5, 6] 
>>> a = [ 
... [ 1, 2, 3, 4], 
... [ 5, 6, 7, 8], 
... [ 9, 10, 11, 12], 
... [13, 14, 15, 16]] 
>>> clockwise(a) 
[1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10] 

Так что здесь происходит? Аргумент clockwise представляет собой двумерный массив r. Мы хотим распечатать его содержимое слева направо, по часовой стрелке. Поэтому, если двухмерный массив не пуст, мы можем напечатать его первый элемент, который является верхней строкой. Затем мы хотим напечатать последние элементы оставшихся строк (числа справа). Мы не хотим повторять самих себя. Итак, что мы делаем, это преобразовать оставшиеся строки таким образом, чтобы следующие напечатанные числа находились в верхней строке. Мы делаем это, переставляя оставшиеся строки (чтобы они стали столбцами), а затем меняли их.

Возможно алгоритм становится яснее, если я пишу в Haskell:

import Data.List 

clockwise :: [[a]] -> [a] 
clockwise (x:xs) = x ++ (clockwise $ reverse $ transpose $ xs) 
clockwise _  = [] 
+1

+1, хороший ответ – ChristopheD

+0

хороший ответ наверняка! Но меня больше интересует подход и используемый алгоритм. Пожалуйста помоги. –

+0

Я объясню это в секунду :) – Stephan202

Смежные вопросы