Весенние старты 2025 з6

Справка

В 2008 году в Иркутске по инициативе Городского методического совета учителей информатики первый раз состоялся Городской конкурс юных программистов "Весенние старты". С тех пор это соревнование проходит ежегодно и в нём принимает участие не меньше ста школьников. Первоначально было возрастное ограничение - допускались участники не старше 8 класса, однако затем стали допускать всех независимо от возраста.
До 2017 года в конкурсе была одна номинация "Решение задач" (фактически олимпиада) А в 2017 году появилась вторая номинация - "Смотр проектов" (конференция, на которой юные программисты защищают свои проекты, над которыми работали около года).

-----------------------------------

г. Иркутск

Конкурс юных программистов «Весенние старты» 2025
Номинация "Решение программистских задач"
Автор заданий Г.Б. Рейнгольд

Задача F. Заполнение таблицы (25 баллов)
Внимательно посмотрите на приложенные таблицы, как они заполнены.
В левом верхнем углу находится единица. Справа от неё – двойка.
Слева/снизу от двойки – тройка и далее влево/вниз. Когда очередное число окажется в первой колонке, следующее число будет находиться ниже, если можно, либо правее (если нельзя), а затем движение пойдёт вправо/вверх. Когда очередное число окажется в первой строке, следующее будет правее, если можно, либо ниже (если нельзя). И так далее, пока не заполнится вся таблица.

Посмотрите внимательно на рисунки.

Нужно сделать программу, заполняющую такую таблицу. Количество строк и колонок задаётся.

Формат входных данных: два целых в одной строке (> 1 и <= 100).

Формат выходных данных: столько строк, каково первое число. В каждой
строке столько целых чисел, каково второе число.

Пример 1:
Вход – 3 2
Выход –
1 2
3 5
4 6

Пример 2:
Вход – 3 5
Выход –
1 2 6 7 12
3 5 8 11 13
4 9 10 14 15

Авторское решение (Python)

# Рейнгольд Г.Б.
# Весенние старты 2025 Задача F Заполнение таблицы
# Для того, чтобы справиться с этой несложной задачей, нужно уметь уверенно
# работать с переменными, ветвлениями, циклами и массивами.

def vime(ns, nk, a): # Вывод таблицы
    for i in range(1, ns + 1, 1):
        for j in range(1, nk + 1, 1):
            #if a[i][j] < 10:
                #print(' ', end = '')  # Выравнивание колонок для удобного тестирования
            print(a[i][j], end = ' ')
        print()

def spm(ns, nk):  # Создание пустой таблицы заданных размеров (количество строк и колонок
    a = [0]*(ns + 2)  # В таблице для удобства работы создаются по две лишних колонки и строки,
                # заполненных "-1" слева и справа, сверху и снизу
    for i in range(0, ns + 2, 1):
        a[i] = [0]*(nk + 2)
      
    for i in range(0, ns + 2, 1): # "Лишние" колонки
        a[i][0] = -1
        a[i][nk + 1] = -1
       
    for i in range(0, nk + 2, 1): # "Лишние" строки
        a[0][i] = -1
        a[ns + 1][i] = -1
    return a

ns, nk = map(int, input().split())
a = spm(ns, nk)
n = ns * nk

i = 1
x = 1
y = 1
a[y][x] = 1

while i < n:
    # Один раз вправо, или вниз, в зависимости от возможностей
    if a[y][x + 1] == 0:
        x += 1
    elif a[y + 1][x] == 0:
        y += 1
    i += 1
    if i > n: # превышение индекса
        break
    a[y][x] = i

    while a[y + 1][x - 1] == 0: # Диагональное направление влево/вниз, многократно
        i += 1
        if i > n: # превышение индекса
            break
        x -= 1
        y += 1
        a[y][x] = i

    # Один раз вниз, или вправо, в зависимости от возможностей
    if a[y + 1][x] == 0:
        y += 1
    elif a[y][x + 1] == 0:
        x += 1
    i += 1
    if i > n: # превышение индекса
        break
    a[y][x] = i

    while a[y - 1][x + 1] == 0: # Диагональное направление вправо/вверх, многократно
        i += 1
        if i > n: # превышение индекса
            break
        x += 1
        y -= 1
        a[y][x] = i
   
vime(ns, nk, a)       
       


Рецензии
Сложные задачи. с уважением:-))удачи в творчестве.

Александр Михельман   25.04.2026 18:03     Заявить о нарушении