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

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


берем матрицу, поварачиваем матрицуцу. выводим матрицу))))) good.gif
reboot
оч смешно.....а что нибудь по серьезнее можно?....мне реально нужна помощь..или ссылку скиньте, если где нибудь уже есть
Lapp
Цитата(amega @ 16.02.2009 15:48) *
берем матрицу, поварачиваем матрицуцу. выводим матрицу))))) good.gif
amega, юмор без отношения к делу оставь для раздела Юмор mad.gif. Есть что сказать по делу - говори, нет - будь добр, не флуди.
Lapp
Вот поворот матрицы на 90 градусов (это ты называешь шагом?).
Используй ее несколько раз, если нужно.
const
k=4;

var
a,b: array[1..k,1..k]of integer;
i,j: integer;

begin
for i:=1 to k do for j:=1 to k do a[i,j]:=Random(10);
for i:=1 to k do begin
for j:=1 to k do Write(a[i,j]);
WriteLn
end;
WriteLn;

for i:=1 to k do for j:=1 to k do b[i,j]:=a[-j+k+1,i];

for i:=1 to k do begin
for j:=1 to k do Write(b[i,j]);
WriteLn
end;
end.
reboot
спасибо...но не много не то......под шагом тут понимается на сколько символов надо сдвинуть, а не поворот под градусом
то есть к примеру первый a[1,1] при шаге в 1 символ сдвинется на a[2,1], при шаге в 3 символа на a[4,1]...
то есть поворот все же есть...но по другому
amega
у меня похожее задание было на защите лабы ток там было только по кромке здвинуть...
попробуу обяснить как я зделал:
береш а11 заносиш в буфер, пото опишуеш проход по кромке матрице, и в етом проходе здвигаеш на 1 елемент, и потом вставляеш из буфера на положеное место,
тоесть
Нажмите для просмотра прикрепленного файла

на рисунке розовоей линией показан проход по кромке а зеленой как здвигать елементы, после прохода а11 поставить на а12(первый рядок второй столбец, я приывик сначала строки писать)
в общем 11 можно задатьь в проходе цыкла от 1 до count/2 и будет здвигатся "каждая кромка"

если нужно здинуть N раз то нужно во те все запустить еще в одном цикле N раз
Lapp
Цитата(reboot @ 16.02.2009 18:27) *
спасибо...но не много не то......под шагом тут понимается на сколько символов надо сдвинуть, а не поворот под градусом
то есть к примеру первый a[1,1] при шаге в 1 символ сдвинется на a[2,1], при шаге в 3 символа на a[4,1]...
то есть поворот все же есть...но по другому
Хм.. Извини, но если ты хочешь какую-то нестандартную операцию, то изволь определить ее полностью и детально. И если под словом "дом" ты реально понимаешь гибрид слона со столом, то лучше не трать время тех, кто хочет тебе помочь. Операция "поворот", которую ты упомнинал в первом сообщении:
Цитата(reboot @ 16.02.2009 14:57) *
Сформировать матрицу и повернуть ее по часовой стрелке на N шагов...
- подразумевает (в общепринятом смысле) именно то, что я сделал (хотя слово "шаг" действительно вносит некоторое сомнение относительно того, понимаешь ли ты сам, что спрашиваешь). Твой "поворот" нигде в математике не употребляется. И если тебя не устраивает общепринятый смысл слов - приводи свой "словарь".

amega тебе описал алгоритм, вот его реализация, распространенная с кромки (то есть внешнего слоя) на все слои.
  for i:=1 to k div 2 do begin
b:=a[i,i];
for j:=i to k-i do a[j,i]:=a[j+1,i];
for j:=i to k-i do a[k-i+1,j]:=a[k-i+1,j+1];
for j:=k-i downto i do a[j+1,k-i+1]:=a[j,k-i+1];
for j:=k-i downto i+1 do a[i,j+1]:=a[i,j];
a[i,i+1]:=b
end;
reboot
спасибо..вы мне очень помогли
ps простите меня за мое не умение правильно формулировать задачу.....но это не мои слова..так как я привел задачу такой, какой продиктовала нам наша преподавательница..слово в слово....и термины теже
amega
Lapp

ты можеш проставить коментарии своего кода


for i:=1 to k div 2 do begin
b:=a[i,i];
for j:=i to k-i do a[j,i]:=a[j+1,i];
for j:=i to k-i do a[k-i+1,j]:=a[k-i+1,j+1];
for j:=k-i downto i do a[j+1,k-i+1]:=a[j,k-i+1];
for j:=k-i downto i+1 do a[i,j+1]:=a[i,j];
a[i,i+1]:=b
end;

Lapp
Цитата(amega @ 21.02.2009 19:05) *
ты можеш проставить коментарии своего кода
Вечером сделаю))
Lapp
Выполняю обещанное)).

 for i:=1 to k div 2 do begin  {цикл по слоям (квадратам), от внешнего к внутреннему}
b:=a[i,i]; {сохраняем левый верхний элемент}
for j:=i to k-i do a[j,i]:=a[j+1,i]; {поэлементно двигаем левую сторону квадрата вверх на одну позицию}
for j:=i to k-i do a[k-i+1,j]:=a[k-i+1,j+1]; {двигаем нижнюю сторону влево}
for j:=k-i downto i do a[j+1,k-i+1]:=a[j,k-i+1]; {двигаем правую сторону вниз}
for j:=k-i downto i+1 do a[i,j+1]:=a[i,j]; {двигаем верхнюю сторону вправо - кроме последнего элемента}
a[i,i+1]:=b {кладем сохраненный элемент во вторую позицию верхней стороны квадрата}
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.