Мини-урок · перед практикой

Поменять столбцы

В каждой строке меняем местами элементы с индексами i и j.

Как к ней подойти

Разберитесь, как работать со строками и столбцами двумерного массива, не путая индексы.

Коротко о теме

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

Ключевая идея · Обмен на месте

Множественное присваивание сначала вычисляет правую часть, поэтому ни одно значение не теряется.

Проверьте перед запуском

  • Функция должна менять массив, а не только локальные переменные.
  • При i=j массив остаётся прежним.

Сравните свой подход

Ниже - готовое решение, другой способ, если он есть, и важные детали проверки.

Ваше принятое решение

Рекомендуемое решение: Обмен на месте

Множественное присваивание сначала вычисляет правую часть, поэтому ни одно значение не теряется.

def swap_columns(a, i, j):
    for row in a:
        row[i], row[j] = row[j], row[i]
n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
i, j = map(int, input().split())
swap_columns(a, i, j)
for row in a:
    print(*row)

Время: O(nm), включая чтение и вывод; обмен O(n). Память: O(nm) для массива; обмен O(1) дополнительно.

Другой способ: Перестроение строк по перестановке индексов

Сначала строим перестановку номеров столбцов, затем применяем её ко всем строкам. Это обобщается на произвольный порядок столбцов.

def swap_columns(a, i, j):
    order = list(range(len(a[0])))
    order[i], order[j] = order[j], order[i]
    for r in range(len(a)):
        a[r] = [a[r][c] for c in order]
n, m = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(n)]
i, j = map(int, input().split())
swap_columns(a, i, j)
for row in a:
    print(*row)

Время: O(nm). Память: O(nm) для массива и O(m) дополнительной памяти.