Помощь - Поиск - Пользователи - Календарь
Полная версия: Перестановка блоков матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Олег
Вот решаю я задачу:
Дана действительная квадратная матрица порядка 2N. Получить новую матрицу, переставляя ее блоки размера NxN в соответствии с рисунком

Собственно, не приходит идеи, как это сотворить. Вначале предполагал повернуть на 180, но тогда меняется содержимое блоков при N больше 1-го.

Заранее спасибо.
Олег
Вот сам рисунок. Не вставляется тегом img почему-то
мисс_граффити
можешь определить номера строки и столбца, ограничивающих каждый из блоков?
после этого я бы посоветовала нарисовать поэлементную схему и посмотреть, какой элемент (по индексам) станет на место какого - сразу увидишь закономерность и сможешь написать цикл.
Алена
Цитата
Дана действительная квадратная матрица порядка 2N. Получить новую матрицу, переставляя ее блоки размера NxN в соответствии с рисунком
Если описать вспомогательный тип так:
type
box = array[1 .. n, 1 .. n] of real;
matrix = array[1 .. 2, 1 .. 2] of box;

и твою матрицу привести к этому типу, то решение задачи уложится в 4 строки безо всяких циклов...

Добавлено:
Нет... К сожалению так не получится, компилятор видит матрицы по-другому... Альтернативное решение: сначала отразить матрицу относительно главной, а потом относительно побочной диагонали (порядок можно изменить, это не столь важно, главное - что надо сделать последовательно ОБА отражения). Итого - один вложенный цикл.
Олег
2мисс_граффити

Обязательно попробую.

2Алена

Уже проходил - получаем то же, что при повороте на 180 - порядок элементов каждого блока НЕ ДОЛЖЕН меняться((
мисс_граффити
так он и не будет вроде...
мы же блок рассматриваем как элемент массива - единое целое...
Алена
procedure swap_lines(a, b: integer);
var
i: integer;
T: real;
begin
for i := 1 to 2 * n do begin
T := arr[a, i]; arr[a, i] := arr[b, i]; arr[b, i] := T;
end;
end;
procedure swap_columns(a, b: integer);
var
i: integer;
T: real;
begin
for i := 1 to 2 * n do begin
T := arr[i, a]; arr[i, a] := arr[i, b]; arr[i, b] := T;
end;
end;

...
for i := 1 to n do swap_lines(i, n+i);
for i := 1 to n do swap_columns(i, n+i);
...
Олег
2Мисс граффити
Дык в том то и дело, что блок - это четверть матрицы по сути, оно не ограничено....



М.... спасибо, сам намудрил - Делаем так:

1 | 2
3 | 4

Вначале меняем 1 и 4, потом 3 и 2


Var i,j,n:byte; x:real; A:array[0..10,0..10] of real;
For i:=1 to n do
For j:=1 to n do
Begin
x:=A[i,j]; A[i,j]:=A[i+N,j+N]; A[i+N,j+N]:=x;
x:=A[i+N,j]; A[i+N,j]:=A[i,j+N]; A[i,j+N]:=x;
End;

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.