from pprint import pprint def spiral_from_center(n): """ Повертає матрицю n x n, заповнену натуральними числами від 1 від центра, розходячись по спіралі вправо -> вверх -> вліво -> вниз ... (усі індентації зроблені 4 пробілами) """ # створюємо матрицю нулями matrix = [[0 for _ in range(n)] for _ in range(n)] # початкова позиція — центр x = n // 2 # колонка y = n // 2 # рядок num = 1 matrix[y][x] = num # напрямки: вправо, вгору, вліво, вниз (так отримуємо приклад з попередніх повідомлень) dirs = [(0, 1), (-1, 0), (0, -1), (1, 0)] step = 1 while num < n * n: for dx, dy in dirs: for _ in range(step): if num >= n * n: break x += dy # примітка: ми використовуємо dx/dy як (row_delta, col_delta) у dirs, y += dx # тому тут записано в такому порядку, щоб коректно змінювались row/col num += 1 if 0 <= x < n and 0 <= y < n: matrix[x][y] = num # після кожних двох напрямків збільшуємо крок # (тобто step змінюється після виконання двох елементів dirs) # тут перевіряємо індекс поточного напрямку за допомогою циклу: # збільшити step після кожного повного циклу двох напрямків # (ми збільшуємо step тут по двох напрямках в одному проході циклу dirs) # але щоб зберегти правильну логіку, збільшуємо step після кожних двох напрямків: # реалізуємо це, роблячи ще один цикл, але простіше — поки num < n*n, будемо збільшувати step вручну: # Тому перезапускаємо dirs з контрольованим збільшенням step нижче. # (щоб уникнути помилок з логікою, ліпше використовувати іншу реалізацію — див. варіант нижче) break # виходимо, бо цей блок — демонстраційний. Далі — коректна реалізація нижче. def spiral_from_center_safe(n): """ Надійна реалізація: починаємо в центрі, рухаємось вправо, вгору, вліво, вниз, після кожних двох напрямків збільшуємо крок (standard spiral). """ matrix = [[0 for _ in range(n)] for _ in range(n)] row = col = n // 2 num = 1 matrix[row][col] = num # directions as (row_delta, col_delta): right, up, left, down directions = [(0, 1), (-1, 0), (0, -1), (1, 0)] step = 1 while num < n * n: for d_index, (dr, dc) in enumerate(directions): for _ in range(step): if num >= n * n: break row += dr col += dc num += 1 if 0 <= row < n and 0 <= col < n: matrix[row][col] = num # після кожних двох напрямків збільшуємо довжину кроку if d_index % 2 == 1: step += 1 return matrix # --- Тест: n = 5 (щоб бачити компактний приклад) --- m5 = spiral_from_center_safe(5) print("n = 5:") pprint(m5) # --- Тест: n = 17 (основна матриця) --- m17 = spiral_from_center_safe(17) print("\nn = 17 (перші 9 рядків показані):") # pprint повністю виведе 17x17; тут показую повний pprint pprint(m17)
Standard input is empty
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]]