fork download
  1. from pprint import pprint
  2.  
  3. def spiral_from_center(n):
  4. """
  5. Повертає матрицю n x n, заповнену натуральними числами
  6. від 1 від центра, розходячись по спіралі вправо -> вверх -> вліво -> вниз ...
  7. (усі індентації зроблені 4 пробілами)
  8. """
  9. # створюємо матрицю нулями
  10. matrix = [[0 for _ in range(n)] for _ in range(n)]
  11.  
  12. # початкова позиція — центр
  13. x = n // 2 # колонка
  14. y = n // 2 # рядок
  15.  
  16. num = 1
  17. matrix[y][x] = num
  18.  
  19. # напрямки: вправо, вгору, вліво, вниз (так отримуємо приклад з попередніх повідомлень)
  20. dirs = [(0, 1), (-1, 0), (0, -1), (1, 0)]
  21.  
  22. step = 1
  23. while num < n * n:
  24. for dx, dy in dirs:
  25. for _ in range(step):
  26. if num >= n * n:
  27. break
  28. x += dy # примітка: ми використовуємо dx/dy як (row_delta, col_delta) у dirs,
  29. y += dx # тому тут записано в такому порядку, щоб коректно змінювались row/col
  30. num += 1
  31. if 0 <= x < n and 0 <= y < n:
  32. matrix[x][y] = num
  33. # після кожних двох напрямків збільшуємо крок
  34. # (тобто step змінюється після виконання двох елементів dirs)
  35. # тут перевіряємо індекс поточного напрямку за допомогою циклу:
  36. # збільшити step після кожного повного циклу двох напрямків
  37. # (ми збільшуємо step тут по двох напрямках в одному проході циклу dirs)
  38. # але щоб зберегти правильну логіку, збільшуємо step після кожних двох напрямків:
  39. # реалізуємо це, роблячи ще один цикл, але простіше — поки num < n*n, будемо збільшувати step вручну:
  40. # Тому перезапускаємо dirs з контрольованим збільшенням step нижче.
  41. # (щоб уникнути помилок з логікою, ліпше використовувати іншу реалізацію — див. варіант нижче)
  42. break # виходимо, бо цей блок — демонстраційний. Далі — коректна реалізація нижче.
  43.  
  44. def spiral_from_center_safe(n):
  45. """
  46. Надійна реалізація: починаємо в центрі, рухаємось вправо, вгору, вліво, вниз,
  47. після кожних двох напрямків збільшуємо крок (standard spiral).
  48. """
  49. matrix = [[0 for _ in range(n)] for _ in range(n)]
  50. row = col = n // 2
  51. num = 1
  52. matrix[row][col] = num
  53.  
  54. # directions as (row_delta, col_delta): right, up, left, down
  55. directions = [(0, 1), (-1, 0), (0, -1), (1, 0)]
  56. step = 1
  57.  
  58. while num < n * n:
  59. for d_index, (dr, dc) in enumerate(directions):
  60. for _ in range(step):
  61. if num >= n * n:
  62. break
  63. row += dr
  64. col += dc
  65. num += 1
  66. if 0 <= row < n and 0 <= col < n:
  67. matrix[row][col] = num
  68. # після кожних двох напрямків збільшуємо довжину кроку
  69. if d_index % 2 == 1:
  70. step += 1
  71.  
  72. return matrix
  73.  
  74. # --- Тест: n = 5 (щоб бачити компактний приклад) ---
  75. m5 = spiral_from_center_safe(5)
  76. print("n = 5:")
  77. pprint(m5)
  78.  
  79. # --- Тест: n = 17 (основна матриця) ---
  80. m17 = spiral_from_center_safe(17)
  81. print("\nn = 17 (перші 9 рядків показані):")
  82. # pprint повністю виведе 17x17; тут показую повний pprint
  83. pprint(m17)
  84.  
Success #stdin #stdout 0.22s 19256KB
stdin
Standard input is empty
stdout
n = 5:
[[17, 16, 15, 14, 13],
 [18, 5, 4, 3, 12],
 [19, 6, 1, 2, 11],
 [20, 7, 8, 9, 10],
 [21, 22, 23, 24, 25]]

n = 17 (перші 9 рядків показані):
[[257,
  256,
  255,
  254,
  253,
  252,
  251,
  250,
  249,
  248,
  247,
  246,
  245,
  244,
  243,
  242,
  241],
 [258,
  197,
  196,
  195,
  194,
  193,
  192,
  191,
  190,
  189,
  188,
  187,
  186,
  185,
  184,
  183,
  240],
 [259,
  198,
  145,
  144,
  143,
  142,
  141,
  140,
  139,
  138,
  137,
  136,
  135,
  134,
  133,
  182,
  239],
 [260, 199, 146, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 132, 181, 238],
 [261, 200, 147, 102, 65, 64, 63, 62, 61, 60, 59, 58, 57, 90, 131, 180, 237],
 [262, 201, 148, 103, 66, 37, 36, 35, 34, 33, 32, 31, 56, 89, 130, 179, 236],
 [263, 202, 149, 104, 67, 38, 17, 16, 15, 14, 13, 30, 55, 88, 129, 178, 235],
 [264, 203, 150, 105, 68, 39, 18, 5, 4, 3, 12, 29, 54, 87, 128, 177, 234],
 [265, 204, 151, 106, 69, 40, 19, 6, 1, 2, 11, 28, 53, 86, 127, 176, 233],
 [266, 205, 152, 107, 70, 41, 20, 7, 8, 9, 10, 27, 52, 85, 126, 175, 232],
 [267, 206, 153, 108, 71, 42, 21, 22, 23, 24, 25, 26, 51, 84, 125, 174, 231],
 [268, 207, 154, 109, 72, 43, 44, 45, 46, 47, 48, 49, 50, 83, 124, 173, 230],
 [269, 208, 155, 110, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 123, 172, 229],
 [270,
  209,
  156,
  111,
  112,
  113,
  114,
  115,
  116,
  117,
  118,
  119,
  120,
  121,
  122,
  171,
  228],
 [271,
  210,
  157,
  158,
  159,
  160,
  161,
  162,
  163,
  164,
  165,
  166,
  167,
  168,
  169,
  170,
  227],
 [272,
  211,
  212,
  213,
  214,
  215,
  216,
  217,
  218,
  219,
  220,
  221,
  222,
  223,
  224,
  225,
  226],
 [273,
  274,
  275,
  276,
  277,
  278,
  279,
  280,
  281,
  282,
  283,
  284,
  285,
  286,
  287,
  288,
  289]]