IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Перестановка блоков матрицы
Олег
сообщение 22.03.2007 10:18
Сообщение #1


Гость






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

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

Заранее спасибо.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 7)
Олег
сообщение 22.03.2007 10:20
Сообщение #2





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


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


Эскизы прикрепленных изображений
Прикрепленное изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 22.03.2007 11:27
Сообщение #3


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Алена
сообщение 22.03.2007 11:46
Сообщение #4


Гость






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

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

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

Сообщение отредактировано: Алена - 22.03.2007 12:37
 К началу страницы 
+ Ответить 
Олег
сообщение 22.03.2007 14:47
Сообщение #5





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


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

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

2Алена

Уже проходил - получаем то же, что при повороте на 180 - порядок элементов каждого блока НЕ ДОЛЖЕН меняться((
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 22.03.2007 16:03
Сообщение #6


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Алена
сообщение 22.03.2007 16:04
Сообщение #7


Гость






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 16:35
Сообщение #8





Группа: Пользователи
Сообщений: 4
Пол: Мужской

Репутация: -  0  +


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;



Сообщение отредактировано: Олег - 22.03.2007 16:39
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.07.2025 18:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"