Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2022, 06:56   #1
shylyakazak
Новичок
Джуниор
 
Регистрация: 16.11.2022
Сообщений: 1
По умолчанию Дана действительная квадратная матрица порядка 2n.

Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя ее блоки размера n x n
Изображения
Тип файла: png Opera Снимок_2022-11-16_024201_xn--90aen0cq.xn--p1ai.png (6.6 Кб, 25 просмотров)
shylyakazak вне форума Ответить с цитированием
Старый 18.11.2022, 23:54   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Для матрицы на основе вложенных списков у меня получились два варианта:
1. Вариант с использованием срезов:
Код:
from random import randint
def copybloc(matrin): # matrin - квадратная матрица размера 2*n
    # Пусть квадратная матрица - это вложенный список
    n = len(matrin)
    matrout = []
    for ri in range(n // 2):  # по строкам до половины матрици
        m = matrin[ri + n // 2][:n // 2:] + matrin[ri][:n // 2:]
        matrout.append(m)
    for ri in range(n // 2):
        m = matrin[ri + n // 2][n // 2:n:] + matrin[ri][n // 2:n:]
        matrout.append(m)
    return matrout

def prnmatr(matr):
    n = len(matr)
    for i in range(n):
        for j in range(n):
            print('{:3d}'.format(matr[i][j]), end = '')
        print()
    
n = 3
m = 2*n
matrin = [[randint(0,50) for i in range(m)] for j in range(m)]

prnmatr(matrin)
print()
matrout = copybloc(matrin)
prnmatr(matrout)
2. Вариант с использованием вложенных циклов:
Код:
from random import randint
def copybloc(matrin, ra, ca, matrout, rb, cb): # matrin - квадратная матрица размера 2*n
                                      # ra, ca - координаты верхнего левого угла (строка, колонка) - откуда
                                      # rb, cb - координаты верхнего левого угла (строка, колонка) - куда
    # Пусть квадратная матрица - это вложенный список
    n = len(matrin)
    for ri in range(ra, ra + n // 2):
        cout = cb
        for ci in range(ca, ca + n // 2):
            matrout[rb][cout] = matrin[ri][ci]
            cout += 1
        rb += 1
    return matrout

def prnmatr(matr):
    n = len(matr)
    for i in range(n):
        for j in range(n):
            print('{:3d}'.format(matr[i][j]), end = '')
        print()
    
n = 3
m = 2*n
matrin = [[randint(0,50) for i in range(m)] for j in range(m)]
matrout = [[0 for i in range(m)] for i in range(m)]
prnmatr(matrin)
print()
prnmatr(matrout)
print()
matrout = copybloc(matrin, 0, 0, matrout, 0, m // 2)
matrout = copybloc(matrin, 0, m // 2, matrout, m // 2, m // 2)
matrout = copybloc(matrin, m // 2, m // 2, matrout, m // 2, 0)
matrout = copybloc(matrin, m // 2, 0, matrout, 0, 0)
prnmatr(matrout)
PS: Об оптимизации не думалось, так что есть и другие варианты
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана действительная квадратная матрица порядка n.Построить последовательность действительных чисел а1,...,а2 по правилу(язык Си) VasiliyUtkin Общие вопросы C/C++ 1 04.10.2016 21:13
(c++)действительная квадратная матрица порядка N bulatdufanze Помощь студентам 2 13.04.2016 23:00
задача на C# (я чайник): Дана действительная квадратная матрица порядка N. Найти сумму элементов... ReKeT15 Помощь студентам 8 14.04.2014 05:50
Действительная квадратная матрица порядка n minimesqa Паскаль, Turbo Pascal, PascalABC.NET 5 12.04.2013 22:56
Дана действительная квадратная матрица порядка n. Найти наибольшее из значений элементов, расположенных в Хутор Паскаль, Turbo Pascal, PascalABC.NET 2 18.12.2010 12:41