• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Поворот массива по часовой стрелке на P шагов

  • Автор темы Автор темы DDOS
  • Дата начала Дата начала

DDOS

Ученик
Регистрация
16 Ноя 2014
Сообщения
8
Реакции
0
Баллы
0
Поворот массива по часовой стрелке на 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
 
Желательно написать в паскале)
 
Задание очень на ваше похоже:
Дана квадратная матрица 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.
 
Да, но у меня цель задачи создать алгоритм, который поворачивает по часовой стрелке К-ый слой матрицы на P шагов)
 
Да, но у меня цель задачи создать алгоритм, который поворачивает по часовой стрелке К-ый слой матрицы на P шагов)
Вам действительно это нужно? К какому сроку?
 
Здравствуйте, Владимир, к сред)Но чем быстрее, тем лучше.
 
Тоже интересно, задание похожее))
 
Ну вот, пожалуйста:
Код:
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.
 

Вложения

  • MATR01.webp
    MATR01.webp
    22.6 KB · Просмотры: 155
Спасибо, Владимир, огромное):wo:
 
Владимир, что вы имели в виду, когда выводится "To big!!!"?
 
Владимир, что вы имели в виду, когда выводится "To big!!!"?
Да не "To big!!!", а "Too big!!!" - слишком большое! Это сообщение выдается, если Вы попытаетесь задать номер слоя, превышающий либо половину количества строк, либо половину количества столбцов.
 
Назад
Сверху