Сортировка неповозрастанию - Turbo Pascal

Формулировка задачи:

Матрица n*m. Заполнить случайными числами. Отсартировать неповозрастанию по заданной схеме


textual

Код к задаче: «Сортировка неповозрастанию - Turbo Pascal»

const
  max_col = 4;
  max_row = 4;
 
type
  tdirection = (right, left_down, down, right_up);
const
  delta: array[tdirection] of record X, Y: integer end =
  ( (X: 1; Y: 0), (X:-1; Y: 1), (X: 0; Y: 1), (X: 1; Y:-1) );
 
function get_next(var dir: tdirection; var col, row: integer): boolean;
var
  new_col, new_row: integer;
  ok: boolean;
begin
  get_next := false;
  if (row = max_row) and (col = max_col) then exit;
 
  case dir of
    right:
      if row = 1 then dir := left_down
      else dir := right_up;
    down:
      if col = 1 then dir := right_up
      else dir := left_down;
  end;
 
  repeat
 
    new_col := col + delta[dir].x; new_row := row + delta[dir].y;
    ok := (new_col >= 1) and (new_col <= max_col) and
          (new_row >= 1) and (new_row <= max_row);
 
    if not ok then
      case dir of
        right: dir := down;
        left_down: dir := down;
        down: dir := right;
        right_up: dir := right;
      end;
 
  until ok;
  col := new_col; row := new_row;
  get_next := true;
 
end;
 
var
  a: array[1 .. max_row, 1 .. max_col] of integer;
  dir: tdirection;
 
  i, j,
  _col, _row,
  first_row, first_col, mx_row, mx_col: integer;
  value: integer;
  T: integer;
 
begin
  writeln('before:');
  for _row := 1 to max_row do
  begin
    for _col := 1 to max_col do
    begin
      a[_row, _col] := random(20);
      write(a[_row, _col]:4);
    end;
    writeln;
  end;
 
  for i := 1 to max_row * max_col - 1 do begin
 
    _col := 1; _row := 1;
    dir := right_up;
 
    for j := 1 to pred(i) do get_next(dir, _col, _row);
    first_col := _col; first_row := _row;
 
    mx_row := first_row; mx_col := first_col;
    repeat
 
      if a[mx_row, mx_col] < a[_row, _col] then begin { <--- Здесь можно изменить направление }
        mx_row := _row; mx_col := _col;
      end
 
    until not get_next(dir, _col, _row);
    T := a[first_row, first_col];
    a[first_row, first_col] := a[mx_row, mx_col];
    a[mx_row, mx_col] := T;
 
  end;
 
  writeln('after:');
  for _row := 1 to max_row do begin
    for _col := 1 to max_col do begin
      write(a[_row, _col]:4);
    end;
    writeln;
  end;
 
end.
Эта работа вам не подошла?

Вы всегда можете заказать любую учебную работу у наших авторов от 20 руб.


СДЕЛАЙТЕ РЕПОСТ

15   голосов, оценка 4.133 из 5

Источник