Заполнить матрицу змейкой - Pascal
Формулировка задачи:
Дано натуральное N (1 ≤ N ≤ 10). Заполнить матрицу порядка NN целыми числами 0, 1, 2, 3, …, N2–1 в соответствии со схемой расположения:
Найти соотношение между значением элемента K и его индексами [i, j], то есть функцию вида F(K, N) = <i, j>, которая по номеру K элемента в змейке возвращает его координаты в матрице <i, j>; другими словами a[i, j] = K. При этом данная функция не должна использовать циклы – только элементарные арифметические действия и проверку различных условий! Построив такую функцию можно простым перебором значений K от 0 до N2–1 находить индексы для каждого K с помощью функции F и записывать в матрицу К по найденным индексам.
0 1 2 3 6 5 4 15 7 8 14 13 9 10 11 12
Решение задачи: «Заполнить матрицу змейкой»
textual
Листинг программы
var tn, n: integer;
procedure get_ij(var i, j: integer; k: integer);
var p, v: integer;
w: boolean;
begin
w := k >= tn;
if w
then v := n * n
else v := tn;
p := v - 1 - k;
i := trunc(sqrt(1 + 8 * p) - 1) div 2;
j := p - i * (i + 1) div 2;
if odd(n - i) then j := i - j;
if w then j := n - 1 - j;
inc(i);
if not w then i := n - i
end;
const m = 10;
var i, j, k: integer;
a: array [0..m-1, 0..m-1] of integer;
begin
repeat
write('n in [1..', m, ']; n = ');
readln(n)
until n in [1..m];
tn := n * (n + 1) div 2;
for k := 0 to n * n - 1 do
begin
get_ij(i, j, k);
a[i, j] := k
end;
for i := 0 to n - 1 do
begin
for j := 0 to n - 1 do write(a[i, j]: 3);
writeln
end;
readln
end.
Объяснение кода листинга программы
- Объявляются переменные
tn,nкак целочисленные. - Создается процедура
get_ijс переменнымиi,j,kкак целочисленные параметры. - В процедуре
get_ijобъявляются переменныеp,vкак целочисленные иwкак логическая. - В теле процедуры
get_ijвычисляются значения переменныхw,v,p,i,jсогласно заданным формулам. - В основной части программы объявляется константа
mи переменныеi,j,kкак целочисленные, а также массивaразмерностиm-1хm-1. - Вводится значение переменной
nв диапазоне от 1 доm. - Вычисляется значение
tnпо заданной формуле. - В цикле от 0 до
n*n-1вызывается процедураget_ijдля каждого значенияk, после чего значениеkзаписывается в ячейку массиваaс координатамиiиj. - Выводится матрица
aразмерностиnхn. - Программа ждет ввода, после чего завершает свое выполнение.