Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Перестановка блоков матрицы

Автор: Олег 22.03.2007 14:18

Вот решаю я задачу:
Дана действительная квадратная матрица порядка 2N. Получить новую матрицу, переставляя ее блоки размера NxN в соответствии с рисунком

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

Заранее спасибо.

Автор: Олег 22.03.2007 14:20

Вот сам рисунок. Не вставляется тегом img почему-то


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: мисс_граффити 22.03.2007 15:27

можешь определить номера строки и столбца, ограничивающих каждый из блоков?
после этого я бы посоветовала нарисовать поэлементную схему и посмотреть, какой элемент (по индексам) станет на место какого - сразу увидишь закономерность и сможешь написать цикл.

Автор: Алена 22.03.2007 15:46

Цитата
Дана действительная квадратная матрица порядка 2N. Получить новую матрицу, переставляя ее блоки размера NxN в соответствии с рисунком
Если описать вспомогательный тип так:
type
box = array[1 .. n, 1 .. n] of real;
matrix = array[1 .. 2, 1 .. 2] of box;

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

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

Автор: Олег 22.03.2007 18:47

2мисс_граффити

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

2Алена

Уже проходил - получаем то же, что при повороте на 180 - порядок элементов каждого блока НЕ ДОЛЖЕН меняться((

Автор: мисс_граффити 22.03.2007 20:03

так он и не будет вроде...
мы же блок рассматриваем как элемент массива - единое целое...

Автор: Алена 22.03.2007 20:04

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);
...

Автор: Олег 22.03.2007 20:35

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;


Автор: torsemide to furosemide conversi 19.09.2021 11:41

Propecia Topical

Автор: hydroxychloroquine price walgree 22.09.2021 19:41

Comment Avoir Du Viagra En France

Автор: how to get rid of prednisone wat 9.10.2021 13:42

Acheter Priligy En Ligne Usa

Автор: how long does it take for plaque 4.12.2021 12:36

Cialis One Day Prix