Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для VistaSV30
988 / 332 / 79
Регистрация: 10.04.2012
Сообщений: 1,245
Записей в блоге: 4

Заполнение прямоугольной матрицы по спирали

27.02.2025, 16:37. Показов 1982. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый день!

На вход программе подаются два натуральных числа n и m. Напишите функцию fill_matrix(n, m), которая создает матрицу размером n х m, заполнив ее по спирали числами от 1 до n x m. Спираль начинается в левом верхнем углу и
закручивается по часовой стрелке.

Моё решение:
Python
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
26
27
28
29
30
31
def fill_matrix(n, m):
    a = [[0]*m for _ in range(n)]
    direction = [[0, 1], [1, 0], [0, -1], [-1, 0]]
    y, x = 0, 0
    d = 0  # Указатель направления движения
 
    for i in range(1, n*m+1):
 
        if (x == m-1) and (y == 0):
            d += 1
 
        if (x == m-1) and (y == n-1):
            d += 1
 
        if (x == 0) and (y == n-1):
            d += 1
 
        if a[y + direction[d][0]][x + direction[d][1]] != 0:
            d += 1
 
        if d > 3:
            d = 0
 
        a[y][x] = i
        y += direction[d][0]
        x += direction[d][1]
 
    return a
 
 
fill_matrix(7, 6)
Bash
1
2
3
4
5
6
7
[[1, 2, 3, 4, 5, 6],
 [22, 23, 24, 25, 26, 7],
 [21, 36, 37, 38, 27, 8],
 [20, 35, 42, 39, 28, 9],
 [19, 34, 41, 40, 29, 10],
 [18, 33, 32, 31, 30, 11],
 [17, 16, 15, 14, 13, 12]]
Видел здесь на форуме решение подобной задачи, хочу узнать есть ли более эффективные решения?

Спасибо!
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.02.2025, 16:37
Ответы с готовыми решениями:

Заполнение матрицы по спирали
Сделайте генератор, который создает матрицу размера n×m, заполняя её по спирали, как в примере ниже: Если n=3,m=4: ...

Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого элемента
Помогите пожалуйста Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного нулевого...

Дана прямоугольная матрица случайных чисел
Дана прямоугольная матрица случайных чисел. Заменить все нечетные числа нулями, а четные умножить на 3.

3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,740
Записей в блоге: 14
27.02.2025, 16:54
VistaSV30, по-моему, хорошее решение.
1
14 / 13 / 2
Регистрация: 18.02.2012
Сообщений: 75
28.02.2025, 01:36
VistaSV30, Привет. Задание заинтересовало меня, решил написать как я вижу (универсальное решение):
Python
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
import random
from typing import List
 
# На вход программе подаются два натуральных числа n и m.
# Напишите функцию fill_matrix(n, m), которая создает матрицу размером n х m,
# заполнив ее по спирали числами от 1 до n x m. Спираль начинается в левом верхнем углу и
# закручивается по часовой стрелке.
 
 
def get_start_point(n_size: int, m_size: int, start_point: str) -> tuple[int, int]:
    """
    Вернёт координату стартовой точки.
 
    :param n_size: Размер матрицы по горизонтали.
    :param m_size: Размер матрицы по вертикали.
    :param start_point: Начальная точка (left_top, left_bottom, right_bottom, right_top).
    :return: Координата (y, x) tuple[int, int].
    """
    if start_point == "left_top":
        point = (0, 0)
    elif start_point == "left_bottom":
        point = (m_size - 1, 0)
    elif start_point == "right_bottom":
        point = (m_size - 1, n_size - 1)
    elif start_point == "right_top":
        point = (0, n_size - 1)
    else:
        raise ValueError(
            "Стартовая точка должна быть: 'left_top', 'left_bottom', 'right_bottom', 'right_top'"
        )
    return point
 
 
def get_start_direction(start_point: str, clockwise: bool) -> tuple[int, int]:
    """
    Возвращает начальное направление отсчёта.
 
    :param start_point: Начальная точка (left_top, left_bottom, right_bottom, right_top).
    :param clockwise: По часовой (True) или против (False).
    :return: Кортеж delta_y, delta_x.
    """
    if (clockwise and start_point == "left_top") or (
        not clockwise and start_point == "left_bottom"
    ):
        delta_x = 1
        delta_y = 0
    elif (clockwise and start_point == "left_bottom") or (
        not clockwise and start_point == "right_bottom"
    ):
        delta_x = 0
        delta_y = -1
    elif (clockwise and start_point == "right_bottom") or (
        not clockwise and start_point == "right_top"
    ):
        delta_x = -1
        delta_y = 0
    else:
        delta_x = 0
        delta_y = 1
    return delta_y, delta_x
 
 
def print_matrix(matrix: List[List[int]]) -> None:
    """
    Выводит матрицу на экран.
 
    :param matrix: Матрица.
    :return: None.
    """
    max_elem = max(max(row) for row in matrix)
    for row in matrix:
        for elem in row:
            text = "{:>{width}}".format(str(elem), width=len(str(max_elem)))
            print(text, end=" ")
        print()
 
 
def fill_matrix(
    n_size: int, m_size: int, start_point: str = "left_top", clockwise: bool = True
) -> List[List[int]]:
    """
    Создает матрицу размером n х m, заполнив ее по спирали числами от 1 до n x m.
 
    :param n_size: Размер матрицы по горизонтали.
    :param m_size: Размер матрицы по вертикали.
    :param start_point: Начальная точка (left_top, left_bottom, right_bottom, right_top).
    :param clockwise: По часовой (True) или против (False).
    :return: List[List[int]].
    """
    matrix = [[0] * n_size for _ in range(m_size)]
    y, x = get_start_point(n_size, m_size, start_point)
    delta_y, delta_x = get_start_direction(start_point, clockwise)
 
    for i in range(1, n_size * m_size + 1):
        matrix[y][x] = i
        if i == n_size * m_size:
            break
        next_x = x + delta_x
        next_y = y + delta_y
        if delta_x and (next_x < 0 or next_x > (n_size - 1) or matrix[y][next_x]):
            delta_y = delta_x if clockwise else -1 * delta_x
            delta_x = 0
        elif delta_y and (next_y < 0 or next_y > m_size - 1 or matrix[next_y][x]):
            delta_x = -1 * delta_y if clockwise else delta_y
            delta_y = 0
        x += delta_x
        y += delta_y
    return matrix
 
 
if __name__ == "__main__":
 
    for _ in range(30):
        n = random.choice(range(2, 10))
        m = random.choice(range(2, 10))
        direction = bool(random.randint(0, 1))
        starting_point = random.choice(
            ["left_top", "left_bottom", "right_bottom", "right_top"]
        )
        print(
            f"Матрица {n}х{m}. "
            f"Начальная точка: {starting_point}. "
            f"Направление: {'По часовой' if direction else 'Против часовой'}"
        )
        print("-" * 50)
        my_matrix = fill_matrix(
            n_size=n, m_size=m, start_point=starting_point, clockwise=direction
        )
        print_matrix(my_matrix)
        print("-" * 50)
1
14 / 13 / 2
Регистрация: 18.02.2012
Сообщений: 75
28.02.2025, 18:48
Немного подправил (на результат не влияет):
Python
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import random
from typing import List
 
 
def get_start_point(n_size: int, m_size: int, start_point: str) -> tuple[int, int]:
    """
    Вернёт координату стартовой точки.
 
    :param n_size: Размер матрицы по горизонтали.
    :param m_size: Размер матрицы по вертикали.
    :param start_point: Начальная точка (left_top, left_bottom, right_bottom, right_top).
    :return: Координата (y, x) tuple[int, int].
    """
    if start_point == "left_top":
        point = (0, 0)
    elif start_point == "left_bottom":
        point = (m_size - 1, 0)
    elif start_point == "right_bottom":
        point = (m_size - 1, n_size - 1)
    elif start_point == "right_top":
        point = (0, n_size - 1)
    else:
        raise ValueError(
            "Стартовая точка должна быть: 'left_top', 'left_bottom', 'right_bottom', 'right_top'"
        )
    return point
 
 
def get_start_direction(start_point: str, clockwise: bool) -> tuple[int, int]:
    """
    Возвращает начальное направление отсчёта.
 
    :param start_point: Начальная точка (left_top, left_bottom, right_bottom, right_top).
    :param clockwise: По часовой (True) или против (False).
    :return: Кортеж delta_y, delta_x.
    """
    if (clockwise and start_point == "left_top") or (
        not clockwise and start_point == "left_bottom"
    ):
        delta_x = 1
        delta_y = 0
    elif (clockwise and start_point == "left_bottom") or (
        not clockwise and start_point == "right_bottom"
    ):
        delta_x = 0
        delta_y = -1
    elif (clockwise and start_point == "right_bottom") or (
        not clockwise and start_point == "right_top"
    ):
        delta_x = -1
        delta_y = 0
    else:
        delta_x = 0
        delta_y = 1
    return delta_y, delta_x
 
 
def print_matrix(matrix: List[List[int]]) -> None:
    """
    Выводит матрицу на экран.
 
    :param matrix: Матрица.
    :return: None.
    """
    max_elem = max(max(row) for row in matrix)
    for row in matrix:
        for elem in row:
            text = "{:>{width}}".format(str(elem), width=len(str(max_elem)))
            print(text, end=" ")
        print()
 
 
def fill_matrix(
    n_size: int, m_size: int, start_point: str = "left_top", clockwise: bool = True
) -> List[List[int]]:
    """
    Создает матрицу размером n х m, заполнив ее по спирали числами от 1 до n x m.
 
    :param n_size: Размер матрицы по горизонтали.
    :param m_size: Размер матрицы по вертикали.
    :param start_point: Начальная точка (left_top, left_bottom, right_bottom, right_top).
    :param clockwise: По часовой (True) или против (False).
    :return: List[List[int]].
    """
    matrix = [[0] * n_size for _ in range(m_size)]
    y, x = get_start_point(n_size, m_size, start_point)
    delta_y, delta_x = get_start_direction(start_point, clockwise)
    matrix[y][x] = 1
    for i in range(2, n_size * m_size + 1):
        next_x = x + delta_x
        next_y = y + delta_y
        if delta_x and (next_x < 0 or next_x > (n_size - 1) or matrix[y][next_x]):
            delta_y = delta_x if clockwise else -1 * delta_x
            delta_x = 0
        elif delta_y and (next_y < 0 or next_y > m_size - 1 or matrix[next_y][x]):
            delta_x = -1 * delta_y if clockwise else delta_y
            delta_y = 0
        x += delta_x
        y += delta_y
        matrix[y][x] = i
    return matrix
 
 
if __name__ == "__main__":
 
    for _ in range(30):
        n = random.choice(range(2, 10))
        m = random.choice(range(2, 10))
        direction = bool(random.randint(0, 1))
        starting_point = random.choice(
            ["left_top", "left_bottom", "right_bottom", "right_top"]
        )
        print(
            f"Матрица {n}х{m}. "
            f"Начальная точка: {starting_point}. "
            f"Направление: {'По часовой' if direction else 'Против часовой'}"
        )
        print("-" * 50)
        my_matrix = fill_matrix(
            n_size=n, m_size=m, start_point=starting_point, clockwise=direction
        )
        print_matrix(my_matrix)
        print("-" * 50)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.02.2025, 18:48
Помогаю со студенческими работами здесь

Случайное заполнение и сложение матриц
Добрый день, не могу справится с задачей. Напишите программу, которая случайным образом заполняет две матрицы 5×5 целыми числами,...

Умножение прямоугольных матриц
добрый вечер. Подскажите пожалуйста как сделать умножение прямоугольных матриц, т.е не nXn , а mxn? именно на языке Python. и нужно без...

Дана прямоугольная матрица случайных чисел. Заменить все нечетные числа нулями, а четные умножить на 3
Дана прямоугольная матрица случайных чисел. Заменить все нечетные числа нулями, а четные умножить на 3.

Дана целочисленная прямоугольная матрица
Дана целочисленная прямоугольная матрица. 1. Определить количество столбцов, не содержащих ни одного нулевого элемента. 2....

Дана целочисленная прямоугольная матрица. Определить:
Дана целочисленная прямоугольная матрица. Определить: 1. Сумму элементов в тех строках, которые содержат хотя бы один отрицательный ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru