[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Программирование 1 курс (ПОИТ, ПМ) 1, 2, 3, 4
Автор Сообщение
Антон Логинов

Темы: 0
Сообщений: 10

Мой профиль
http://dl.gsu.by/task.jsp?nid=1735107&cid=1063
нам нужно повернуть матрицу на угол кратный 45
для это будем отдельно поворачивать на 90(если потребуется несколько раз) и 45
для поворота на 90 в конечной матрице число строк будет равно числу столбцов в начальной, а также в конечной число столбцов рано числу строк в начальной и в конечной матрице
элемент с позицией [i, j] равен элементу с позициейй [кол-во столбцов -j+1,i]в начальной(т.е. первый столбец станет первой строкой)
для поворота на 45 градусов создадим отдельный массив диагоналей, сложив строку и столбец(и отняв еденицу)получим номер диагонали и занесём в массив
при выводе добавим недостающих пробелов
  var
  a,b,q:array[1..100,1..100]of char;
  k:array[1..1000]of longint;
  i,j,r,c,gr:longint;
  s:string;
 
  procedure pov90(); //процедура поворота на 90 градусов
    var 
      i,j,h:longint;
    begin
      h:=r;r:=c;c:=h; //замена значения строк на столбцы
      for i:=1 to r do
      for j:=1 to c do b[i,j]:=a[c-j+1,i]; //поворот
      a:=b; //возрат к начальной матрице
    end;

begin
  readln(r,c); 
  for i:=1 to r do 
    begin
      for j:=1 to c do read(a[i,j]);
      readln; 
    end;
  readln(gr);                             //ввод 

  for i:=1 to (gr div 90) do pov90(); //проводим процедуру поворота на 90 градусов сколько нужно раз

  if gr mod 90=0 then //проверка поворота на 45 если нет,то вывод ,иначе поворот и вывод
    begin
      for i:=1 to r do 
        begin
          for j:=1 to c do write(a[i,j]);
          writeln;
        end; //вывод
    end else begin

        for i:=r downto 1 do 
          for j:=1 to c do //перебор символов
            begin
              inc(k[i+j-1])          //k[i+j-1] - диагональ в прямоугольнике 
              q[i+j-1,k[i+j-1]]:=a[i,j]; //занесение в массив диагоналей
            end;

    	for i:=1 to r+c-1 do 
      	  begin
            s:=''; //обнуление
            for j:=1 to abs(min(r,c)-i) do s:=s+' ' ; //добавление пробелов
      	    for j:=1 to k[i] do s:=s+' '+q[i,j]; //добавление символов
      	    delete(s,1,1); //через строку, чтобы избывиться от пробела в начале
      	    writeln(s); //вывод 
          end;

   end;
end.

Михаил Долинский

Темы: 1392
Сообщений: 33725

Мой профиль


Антон Логинов:

http://dl.gsu.by/task.jsp?nid=1735107&cid=1063
 
+20 бонусов (60->80) за описание решения
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Программирование 1 курс (ПОИТ, ПМ) 1, 2, 3, 4
Time:0,047