Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Поворот массива по часовой стрелке на P шагов (http://www.tehnari.ru/f41/t99539/)

DDOS 16.11.2014 13:14

Поворот массива по часовой стрелке на P шагов
 
В заданном k-ом слое элементов целочисленного прямоугольного массива matrixnm сдвинуть все элементы на p шагов по часовой стрелке. Номер слоя k и количество шагов p задать с консоли.

Входные данные для n=4, m=5, k=2, p=2:
v_min=-20
v_max=10
Исходный массив:
Код:

  7    -2  -11      3    -5
  5      2    0    10      1
-15      9  -12      8    -18
  0    -10    9    -13      4

Выходной массив:
Код:

  7    -2  -11      3    -5
  5    -12    9      2      1
-15      8    10      0    -18
  0    -10    9    -13      4

Помогите пожалуйста)tehno036

DDOS 16.11.2014 13:33

Желательно написать в паскале)

Gruvi 16.11.2014 23:51

Задание очень на ваше похоже:
Дана квадратная матрица A порядка M (M — нечетное число). Начиная с элемента A
1,1 и перемещаясь по часовой стрелке, вывести все
ее элементы по спирали: первая строка, последний столбец, последняя
строка в обратном порядке, первый столбец в обратном порядке, оставшиеся элементы второй строки и т.д.; последним выводится центральный
элемент матрицы.

Код:

uses crt;
const nmax=15;
var a:array[1..nmax,1..nmax]of integer;
    m,i,j:byte;
    x,y,add,dir:integer;
begin
clrscr;
repeat
write('Размер матрицы нечетное число до ',nmax,' m=');
readln(m);
until odd(m)and(m in [1..nmax]);
writeln('Матрица:');
for i:=1 to m do
  begin
    for j:=1 to m do
      begin
        a[i,j]:=(i-1)*m+j;{можно по другому заполнить, это для наглядности}
        write(a[i,j]:4);
      end;
    writeln;
  end;
writeln;
x:=0;{выход слева вверху}
y:=1;
Add:=m; {длина начального пути}
dir:=1;{положительное направление}
while (add<>0) do
begin
  i:=0;
  while (i<>add) do
    begin
    x:=x+dir; {влево или вправо}
    write(a[y,x]:4);
    i:=i+1;
    end;
  i:=0;
  add:=add-1;{прошли отрезок, уменьшаем длину}
  while (i<>add) do
    begin
    y:=y+dir;{вниз или вверх}
    write(a[y,x]:4);
    i:=i+1;
    end;
  dir:=dir*(-1);{прошли 2 отрезка меняем направления}
end;
readln
end.


DDOS 17.11.2014 11:55

Да, но у меня цель задачи создать алгоритм, который поворачивает по часовой стрелке К-ый слой матрицы на P шагов)

Vladimir_S 17.11.2014 11:59

Цитата:

Сообщение от DDOS (Сообщение 1080294)
Да, но у меня цель задачи создать алгоритм, который поворачивает по часовой стрелке К-ый слой матрицы на P шагов)

Вам действительно это нужно? К какому сроку?

DDOS 17.11.2014 12:59

Здравствуйте, Владимир, к сред)Но чем быстрее, тем лучше.

Vladimir_S 17.11.2014 13:06

Цитата:

Сообщение от DDOS (Сообщение 1080306)
Здравствуйте, Владимир, к сред)Но чем быстрее, тем лучше.

Хорошо, попробую сегодня сделать.

Mokingbird 17.11.2014 15:59

Тоже интересно, задание похожее))

Vladimir_S 17.11.2014 16:47

Вложений: 1
Ну вот, пожалуйста:
Код:

Uses CRT;

Const
 N_max=10;
 M_max=16;
 V_min=-20;
 V_max=10;

Type
 Matrix=Array[1..N_max,1..M_max] of Integer;
 Vector=Array[1..2*(N_max+M_max)-3] of Integer;

Var
 N,M,Nv,k,p,i,j:Byte;
 A:Matrix;
 V:Vector;

Procedure Vect(Av:Matrix; var Vv:Vector);
var q,r,d:byte;
begin
 d:=0;
 for r:=k to M-k do
  begin
  Inc(d);
  Vv[d]:=A[k,r];
  end;
 for q:=k to N-k do
  begin
  Inc(d);
  Vv[d]:=A[q,M-k+1];
  end;
 for r:=M-k+1 downto k+1 do
  begin
  Inc(d);
  Vv[d]:=A[N-k+1,r];
  end;
 for q:=N-k+1 downto k+1 do
  begin
  Inc(d);
  Vv[d]:=A[q,k];
  end;
end;

Procedure Sh(var Vs:vector);
var
 q,r:byte;
begin
 for q:=1 to p do
  begin
  for r:=Nv downto 1 do Vs[r+1]:=Vs[r];
  Vs[1]:=Vs[Nv+1];
  end;
end;

Procedure Matr(Vm:Vector);
var q,r,d:byte;
begin
 d:=0;
 for r:=k to M-k do
  begin
  Inc(d);
  A[k,r]:=Vm[d];
  end;
 for q:=k to N-k do
  begin
  Inc(d);
  A[q,M-k+1]:=Vm[d];
  end;
 for r:=M-k+1 downto k+1 do
  begin
  Inc(d);
  A[N-k+1,r]:=Vm[d];
  end;
 for q:=N-k+1 downto k+1 do
  begin
  Inc(d);
  A[q,k]:=Vm[d];
  end;
end;

Begin
 ClrScr;
 Randomize;
 Write('  Number of lines = ');
 Readln(N);
 Write('Number of columns = ');
 Readln(M);
 Repeat
  Write('  Number of layer = ');
  Readln(k);
  If (k>(N div 2)) or (k>(M div 2)) then writeln ('Too big!!!');
 Until (k<=(N div 2)) and (k<=(M div 2));
 Nv:=2*(N+M)-8*k+4;
 Write('            Shift = ');
 Readln(p);
 Writeln;
 for i:=1 to N do
  begin
  for j:=1 to M do
    begin
    A[i,j]:=V_min+ Random(V_max-V_min+1);
    if (((i=k) or (i=N-k+1)) and ((j>=k) and (j<=M-k+1))) or
        (((j=k) or (j=M-k+1)) and ((i>k) and (i<M-k))) then textcolor(12);
    write(A[i,j]:4);
    NormVideo;
    end;
  writeln;
  end;
 Writeln;
 Writeln;
 Vect(A,V);
 Sh(V);
 Matr(V);
 for i:=1 to N do
  begin
  for j:=1 to M do
    begin
    if (((i=k) or (i=N-k+1)) and ((j>=k) and (j<=M-k+1))) or
        (((j=k) or (j=M-k+1)) and ((i>k) and (i<M-k))) then textcolor(12);
    write(A[i,j]:4);
    NormVideo;
    end;
  writeln;
  end;
 Readkey
End.


DDOS 17.11.2014 17:08

Спасибо, Владимир, огромное):wo:


Часовой пояс GMT +4, время: 02:47.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.