Домашние задания: Информатика
РЕШИТЕ ПОЖАЛУЙСТА ЗАДАЧУ ИНФОРМАТИКА
Для тестирования некоторой программы требуется сгенерировать двумерный числовой массив (таблицу) размера 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.
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.
нельзя написать про массив незная на каком языке будешь писать тем более от тебя исходный код программы не программу хотят
Оксана Кривченко
Нужно алгоритм описать на простом языке
Похожие вопросы
- Срочно ,помогите решить пожалуйста ,тест по информатике
- Помоги решить задачу пожалуйста по информатике
- Помогите решить задания по информатике!
- Тест по информатике, помогите решить пожалуйста
- Помогите пожалуйста с информатикой!!!!
- Помогите пожалуйста с информатикой
- Помогите пожалуйста срочно информатика!!!
- Решите пожалуйста информатику, 9 класс
- Помогите пожалуйста решить контрольную по информатике
- Помогите решить дз по информатике
Может пригодится.. В написании алгоритма точно поможет.
Тут ставить задержку в милисекундах (поменьше, чтобы оценить конечный результат, и побольше, чтобы понять что происходит)