Реализовать рекурсивный алгоритм построения цепочки из имеющегося набора костей домино - PascalABC.NET (25080)
Формулировка задачи:
Помогите пожалуйста...
Реализовать рекурсивный алгоритм построения цепочки из имеющегося набора костей домино. Способ задания информации о количестве очков на костях выбрать самостоятельно.
Решение задачи: «Реализовать рекурсивный алгоритм построения цепочки из имеющегося набора костей домино»
textual
Листинг программы
const
N = 10;
D : array[0 .. N - 1, False .. True] of Integer =
(
(5,5), (1,2), (2,3), (4,5), (6,2),
(4,2), (4,3), (3,1), (5,6), (6,6)
);
var
used : array[0 .. N - 1] of Boolean;
function Find_Sequence(First : Integer) : Boolean;
var
i : Integer;
Pair : Boolean;
begin
result := True;
i := 0;
while (i < N) and used[i] do inc(i);
if i = N then Exit;
for i := 0 to N - 1 do
begin
if used[i] then Continue;
if (First <> D[i, False]) and (First <> D[i, True]) then Continue;
used[i] := True;
Pair := False;
if First = D[i, False] then Pair := True;
if Find_Sequence(D[i, Pair]) then // <--- Вот она, рекурсия
begin
writeln(Format('{0}:{1}', D[i, Pair], D[i, not Pair]));
Exit;
end;
used[i] := False;
end;
result := False;
end;
var i : Integer;
begin
for i := 0 to Pred(N) do
used[i] := False;
for i := 0 to 6 do
if Find_Sequence(i) then Break;
end.
Объяснение кода листинга программы
В данном коде реализуется рекурсивный алгоритм построения цепочки из имеющегося набора костей домино.
- В первой строке объявляется константа N, которая определяет количество костей в наборе (в данном случае 10).
- Далее объявляется двумерный массив D, который содержит информацию о каждой кости. Первый индекс указывает на номер кости, а второй - на ее свойство (True - это дубль, False - это простая кость).
- Затем объявляется массив used, который используется для отслеживания использованных костей.
- Далее идет объявление функции Find_Sequence, которая принимает в качестве параметра номер первой кости и возвращает булево значение (True, если цепочка найдена, False - если нет). Внутри функции объявляется цикл, который ищет первую неиспользованную кость с заданным свойством. Если такая кость найдена, то функция вызывает саму себя рекурсивно для поиска цепочки на основе этой кости.
- После определения функции идет блок кода, который ищет цепочки для каждого номера первой кости. Для этого используется цикл, который перебирает все возможные значения первой кости.
- Внутри цикла каждая кость проверяется на использование. Если кость не использована, то проверяется, является ли она дублем или простой костью. Если да, то вызывается функция Find_Sequence рекурсивно для поиска цепочки на основе этой кости. Если цепочка найдена, то она выводится на экран и функция возвращает True. Если нет, то кость помечается как использованная и цикл продолжается.
- В конце блока кода вызывается функция Find_Sequence для каждого номера первой кости. Если хотя бы одна цепочка найдена, то цикл прерывается.
- В конце программы выводится сообщение о том, что цепочки найдены. Таким образом, данный код реализует рекурсивный алгоритм построения цепочки из имеющегося набора костей домино.