Домашние задания: Информатика

РЕШИТЕ ПОЖАЛУЙСТА ЗАДАЧУ ИНФОРМАТИКА

Для тестирования некоторой программы требуется сгенерировать двумерный числовой массив (таблицу) размера N×N, в котором встречаются все натуральные числа от 1 до N^2 в произвольном порядке. Изначально в массиве стоят нули. Для генерации теста разрешено использовать только одну операцию: выбрать два клетки соответствующей таблицы, отстоящие друг от друга на ход коня, и к содержимым этих клеток прибавить по единице. Опишите алгоритм, как это сделать, если это возможно. Размер таблицы задаётся.
// Е*ись конём эта матрица
program Oleg;
uses crt;

const
PAUSE: word = 50; // Пауза между итерациями (мс)
// Список "как ходит конь" (+строка, +столбец)
DIR: array[1..8,0..1] of
byte = ((-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1));

var
mtx: array[,] of word; // Матрица ([0,0] - левый верхний угол)
n: byte; // Размер матрицы
k: uint64 := 0; // Итератор цикла
x1, x2: array of byte; // Координаты откуда и куда идти
max: word; // Текущее максимальное значение элемента матрицы

// Вывод матрицы в консоль
procedure Show(mtx: array[,] of word; title: string);
begin
clrScr();
writeln(#10, title);
for var i := 0 to length(mtx, 0)-1 do begin // Строки
for var j := 0 to length(mtx, 1)-1 do begin // Столбцы
textColor(LightGray);
if (i = x1[0]) and (j = x1[1]) then
textColor(Green); // Откуда - потемнее
if (i = x2[0]) and (j = x2[1]) then
textColor(LightGreen); // Куда - поярче
write(mtx[i,j]:4); // Вывод элемента
end; //for j
textColor(LightGray);
write(#10);
end; // for i
sleep(PAUSE);
end; // procedure

// Допустим ли элемент?
function PosElem(xNext: array of byte): boolean;
begin
if mtx[x1[0],x1[1]] = max then begin
max -= 1;
writeln('Теперь максимум для элемента матрицы = ', max);
//readkey;
end;
if mtx[xNext[0],xNext[1]] < max then
Result := true
else
Result := false;
end; // function

// Все доступные ходы из x1
function PosDirs(x1: array of byte): array of byte;
begin
var dsNext: array of byte; // Возможные ходы
var xNext: array of byte := (0,0); // Планируемая координата
// Перебор всех ходов
for var i := 1 to 8 do begin
xNext[0] := x1[0] + DIR[i][0]; // Планируемая строка
xNext[1] := x1[1] + DIR[i][1]; // Планируемый столбец
// Не выходит ли планируемый ход за рамки матрицы?
if (xNext[0] >= 0) and (xNext[1] >= 0) and
(xNext[0] < n) and (xNext[1] < n) then
// Можно ли будет уйти с той позиции?
if PosElem(xNext) then begin
// Ход возможен
setLength(dsNext, length(dsNext)+1);
dsNext[high(dsNext)] := i;
end; // if PosElem()
xNext[0] := 0;
xNext[1] := 0;
end; //for i
Result := dsNext;
end; // function

// Следующий ход
procedure Next(k: uint64; dNext: byte);
begin
// Куда
x2[0] := x1[0] + DIR[dNext][0];
x2[1] := x1[1] + DIR[dNext][1];
// Выполнить ход
//mtx[x1[0],x1[1]] += 1;
mtx[x2[0],x2[1]] += 1;
Show(mtx, 'Шаг '+k);
// "Куда" стало "Откуда" для следующего хода
x1[0] := x2[0];
x1[1] := x2[1];
end; // procedure

begin
randomize;
setLength(x1, 2);
setLength(x2, 2);
write('N от 5 до 15 = ');
while (n < 5) or (n > 15) do
read(n);
setLength(mtx, n, n);
max := sqr(n); // Начальное значение максимума
var nextDirs: array of byte; // Возможные ходы
while true do begin
nextDirs := PosDirs(x1); // Куда можно идти?
if length(nextDirs) > 0 then begin // Если можно куда-нибудь, то
// идти в одном из возможных направлений (случайном)
Next(k, nextDirs[random(0, high(nextDirs))]);
end // if length
else begin
textColor(Red);
writeln(#10, 'Нет допустимых ходов!');
writeln('Максимум для элемента матрицы = ', max);
break;
end; // else
k += 1; // Следующий шаг
end; // while k
end.
НК
Наталия Казанцева
18 091
Лучший ответ
Наталия Казанцева Я не до конца понял задание когда начал писать.. В общем, эта программа ходит по матрице конем и увеличивает элемент, куда "попал конь", на 1..
Может пригодится.. В написании алгоритма точно поможет.
Наталия Казанцева PAUSE: word = 50; // Пауза между итерациями (мс)
Тут ставить задержку в милисекундах (поменьше, чтобы оценить конечный результат, и побольше, чтобы понять что происходит)
нельзя написать про массив незная на каком языке будешь писать тем более от тебя исходный код программы не программу хотят
Оксана Кривченко Нужно алгоритм описать на простом языке