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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2009, 21:39   #1
RomT24
Пользователь
 
Регистрация: 10.01.2009
Сообщений: 71
Восклицание КАК повернуть матрицу на 90 градусов вправо (или влево).

Уважаемые программисты!
В задаче дана квадратная матрица порядка M, повернуть её на 90 градусов вправо или влево , когда элемент а[1][1] переходит в а[1][m], a[m][1] в a[1][1] и т.д. Вспомогательную матрицу не использовать.
Кто сможет, помогите!

Последний раз редактировалось RomT24; 10.01.2009 в 22:09.
RomT24 вне форума Ответить с цитированием
Старый 10.01.2009, 23:10   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ищите. я здесь на форуме писал такой код по повороту матрицы.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.01.2009, 00:56   #3
CrazyRabbit
Пользователь
 
Аватар для CrazyRabbit
 
Регистрация: 27.10.2008
Сообщений: 38
По умолчанию

поворот вправо))
Код:
var a,b:array[1..100,1..100]of integer;
i,j,n,p,m:integer;
 begin
  readln(n);
   for i:=1 to n do
    begin
     for j:=1 to n do
      read(a[i,j]);
       readln;
    end;

     for i:=1 to n do
      for j:=1 to n do
       b[j,i]:=a[i,j];

	for i:=1 to n  do
	begin
	p:=0;
	 for j:=1 to n div 2 do
	  begin
	  m:=b[i,j];
	   b[i,j]:=b[i,n-p];
	    b[i,n-p]:=m;
	     inc(p);
	   end;
	 end;

       for i:=1 to n do
	begin
	 for j:=1 to n do
	  write(b[i,j],' ');
	   writeln;
	end;
end.
p.s. не забудь про отзыв!
CrazyRabbit вне форума Ответить с цитированием
Старый 11.01.2009, 13:15   #4
RomT24
Пользователь
 
Регистрация: 10.01.2009
Сообщений: 71
По умолчанию

Спасибо, но мне бы ещё комментарии к основным циклам, а то своими мозгами что то дойти не могу...)
RomT24 вне форума Ответить с цитированием
Старый 11.01.2009, 13:56   #5
RomT24
Пользователь
 
Регистрация: 10.01.2009
Сообщений: 71
Сообщение

И , как я понял, в этом решении используется вспомогательная матрица, а по условию это делать нельзя. Может, у кого есть другие мысли?
RomT24 вне форума Ответить с цитированием
Старый 11.01.2009, 18:21   #6
CrazyRabbit
Пользователь
 
Аватар для CrazyRabbit
 
Регистрация: 27.10.2008
Сообщений: 38
По умолчанию

Мои извинения, не до конца прочитал условие!!!
CrazyRabbit вне форума Ответить с цитированием
Старый 11.01.2009, 18:41   #7
RomT24
Пользователь
 
Регистрация: 10.01.2009
Сообщений: 71
По умолчанию

Не сможешь помочь тогда? (
RomT24 вне форума Ответить с цитированием
Старый 11.01.2009, 21:52   #8
lenant
Пользователь
 
Регистрация: 09.04.2008
Сообщений: 10
По умолчанию

Можно использовать одну матрицу, просто записать вводимые данные не в a[i,j], а в a[i+n,j+n], и потом их оттуда забрать в a[j,i]. Или это будет считаться за вспомогательную матрицу??
lenant вне форума Ответить с цитированием
Старый 12.01.2009, 11:31   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

RomT24,
сейчас некогда написать реализацию.
Идею решения хотите?
для матрицы размером n (в примере n=4)
поворот на 90 градусов по часовой.
идём по главной диагонали.
берём A[1,1] копируем его в A[1,n], элемент, который там был -> A[n,1], тот, в свою очередь в -> A[1,1]
дальше идём по строке от элемента главной диагонали до N-1 элемента по строке
A[2,1] -> A[2,n] -> A[n,n-1] -> A[2,1]
A[3,1] -> A[3,n] -> A[n,n-2] -> A[3,1]
всё. дошли до конца первой строки...
берём следующий элемент главной диагонали:
A[2,2] и крутим по кругу его..
и т.д.

Так понятно?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.01.2009, 12:57   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Реализация идеи Serge_Bliznykov.
Проверил при разных n - вроде работает.

Код:
uses crt;
const n=4;
var
a : array[1..n,1..n] of integer;
i,p,k,tmp1 : integer;
begin
clrscr;
{-----}
randomize;
for i:=1 to n do
  begin
  for k:=1 to n do
   begin
   a[i,k] := random(20);
   write(a[i,k]:5);
   end;
  writeln;
  end;
writeln('------------');
{--------}
p := n div 2;
for i:=1 to p do
  begin
  for k:=i to n-i do
    begin
    tmp1 := a[i,k];
    a[i,k] := a[n-k+1,i];
    a[n-k+1,i] := a[n-i+1,n-k+1];
    a[n-i+1,n-k+1] := a[k,n-i+1];
    a[k,n-i+1] := tmp1;
    end;
  end;
{-------}
for i:=1 to n do
  begin
  for k:=1 to n do
   write(a[i,k]:5);
  writeln;
  end;

readln;
end.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как повернуть изображение на 180 градусов? kl45gp Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 11.05.2013 13:10
Повернуть двумерный массив на 180 градусов - задача на Pascal'е Sanakan Помощь студентам 7 15.12.2008 00:16
Прога по переводу градусов ELL Помощь студентам 8 04.07.2008 23:02
Нарисовать,стереть,повернуть,отразить в паскале! Барби Помощь студентам 2 23.04.2008 00:24
Циклическо сдвинуть элементы массива на K позиций влево, тоже сделать, испульзуя динамические массивы Fimogen Общие вопросы C/C++ 10 03.11.2007 11:19