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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2011, 20:56   #1
Leshiy1
Форумчанин
 
Аватар для Leshiy1
 
Регистрация: 24.09.2009
Сообщений: 104
По умолчанию Sortmatr1

Здравствуйте всем. В матрице надо отсортировать по выделенной траектории

Код:
Program Etape1;
uses crt;
const n = 7; m = 8;     {размеры матрицы}
var  i,j,y,x,kt,xp,yp,b,xm,ym,max: integer;  {рабочие переменные}
     A: array[0..n-1,0..m-1] of Integer;          {матрица*}
{***********************************************************}
Begin
  ClrScr;
  Randomize;
  TextColor(7);
  {---------ввод и печать исходной матрицы---------}
  For y:= 0 to n-1 do
  begin
    For x:= 0 to m-1 do
    begin
      A[y,x]:= random(100);
      write(A[y,x]:3);
    end;
    Writeln;
  end;
  {------------------ поиск max--------------- }
  ym:= 0;
  xm:= 0;
  max:= A[ym,xm];
  for y:= 0 to n-1 do
    for x:= 0 to m-1 do
      if max < A[y,x] then
      begin
        max:= A[y,x];
        ym:= y;
        xm:= x;
      end;
  {--определение числа элементов kt, принадлежащих траектории---}
  if (n-1-ym) < xm then kt:= (n-1-ym)+(m-xm)
  else kt:= n;
  {------ сортировка пузырьком --------- }
  for i:= 0 to kt-1 do    { внешний цикл сортировки}
  begin
    yp:= n-1;  {xp,yp - координаты предыдущего элемента траектории }
    xp:= xm;
    for j:= 0 to kt-2 do { внутренний цикл сортировки}
    begin
      {получение координат х,у следующего эл-та траектории}
      If j < xm then
      begin 		{движение по вертикали}
        x:= xp;
        y:= yp-1;
      end
      else begin         {движение по горизонтали}
             x:= xp+1;
             y:= yp-1;
           end;
      If A[y,x] < A[yp,xp] then {если следующий элемент меньше предыдущего, то обмен}
      begin
        b:= A[y,x];
        A[y,x]:= A[yp,xp];
        A[yp,xp]:= b;
      end;
      xp:= x; {тек. координаты эл-та становятся предыдущими }
      yp:= y;
    end;
  end;
  {------------вывод результатов-------------- }
  writeln;
  writeln(' max = ',max,' xm = ',xm,' ym = ',ym);
  writeln;
  For i:= 0 to n-1 do
  begin
    For j:= 0 to m-1 do write(A[i,j]:3);
    Writeln;
  end;
  {-------------раскраска траектории---------- }
  yp:= n-1;
  xp:= xm;
  TextColor(10);
  for j:= 0 to kt-1 do
  begin
    GotoXY (3*(xp)+1, n+yp+4);
    Write(A[yp,xp]:3);
    If j < xm then {получение координат х,у следующего эл-та траектории}
    begin 	{движение по вертикали}
      x:= xp;
      y:= yp-1;
    end
    else begin {движение по диагонали}
           x:= xp+1;
           y:= yp-1;
         end;
    xp:=x;
    yp:=y;
  end;
  TextColor(7);
  Readkey;
End.
Почему если максимальный элемент выше диагонали, то сворачивает чуть выше диагонали, не доходит до максимального элемента, а если ниже диагонали то переезжает максимальный элемент
Leshiy1 вне форума Ответить с цитированием
Ответ


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