Задать расположение элементов двумерного массива - PascalABC.NET
Формулировка задачи:
Нужно написать программу на паскале, в которой элементы двумерного массива будут располагаться следующим образом.
Заранее благодарю.
Решение задачи: «Задать расположение элементов двумерного массива»
textual
Листинг программы
const
MaxCol = 4; // 6;
MaxRow = 4;
type
TRowIndex = 1 .. MaxRow;
TColIndex = 1 .. MaxCol;
TItem = Integer;
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 = MaxRow) and (col = MaxCol) 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 <= MaxCol) and (new_row >= 1) and (new_row <= MaxRow);
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[TRowIndex, TColIndex] of TItem;
dir : TDirection;
i, k, C, R, pC, pR : Integer;
T : TItem;
begin
writeln('Init matrix:');
for R in TRowIndex do
begin
for C in TColIndex do
begin
a[R, C] := random(200);
write(a[R, C]:4);
end;
writeln;
end;
// Вот она, самая простая пузырьковая сортировка:
for K := MaxRow * MaxCol - 1 downto 1 do
begin
C := 1; R := 1; // Начинаем обход всегда с левой верхней ячейки, (1, 1)
dir := right_up; // направление движения задаем "по диагонали, вправо и вверх"
for i := 1 to K do
begin
pC := C; pR := R; // Это позиция предыдущей найденной ячейки.
get_next(dir, C, R); // Запоминаем ее и ищем следующую
if a[pC, MaxCol - pR + 1] > a[C, MaxCol - R + 1] then // А теперь (по алгоритму "пузызька") сравниваем предыдущую со следующей
begin
T := a[pC, MaxCol - pR + 1];
a[pC, MaxCol - pR + 1] := a[C, MaxCol - R + 1];
a[C, MaxCol - R + 1] := T;
end;
end;
end;
writeln('Result matrix:'); // Всё, вывод результата
for R in TRowIndex do
begin
for C in TColIndex do
begin
write(a[R, C]:4);
end;
writeln;
end;
end.
Объяснение кода листинга программы
В данном коде реализована сортировка двумерного массива методом пузырька. Вот список действий, которые происходят в коде:
- Инициализация двумерного массива случайными значениями от 200 до 1.
- Создание переменных для хранения текущей позиции (C, R), направления движения (dir), а также для хранения предыдущей позиции (pC, pR).
- Обход массива в порядке, заданном направлением движения (по умолчанию -
по диагонали, вправо и вверх). - Сравнение значения ячейки по текущей позиции с значением ячейки по предыдущей позиции.
- Если значение ячейки по текущей позиции больше, то значения ячеек меняются местами.
- После завершения цикла, результат сортировки выводится на экран.