Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2021, 13:42   #1
canadamoscow
Пользователь
 
Аватар для canadamoscow
 
Регистрация: 16.05.2020
Сообщений: 57
По умолчанию Построение цепочки из костяшек домино

Берутся случайных N костяшек из одного набора домино (1<=N<=28).
Задача состоит в том, чтобы образовать из этих N костяшек самую длинную
цепочку, состыковывая их по правилам домино частями с равным количеством
точек.

Входные данные: генерируется массив из N пар цифр костяшек.
Выходные данные: строка содержащая пример цепочки максимальной длины
а следующая строка - количество костяшек в цепочке

Пример:
N = 8
[0,4] [0,2] [2,5] [5,5] [0,1] [0,3] [2,3] [2,2]
[1,0] [0,2] [2,2] [2,3] [3,0] [0,4]
6
canadamoscow вне форума Ответить с цитированием
Старый 05.06.2021, 13:43   #2
canadamoscow
Пользователь
 
Аватар для canadamoscow
 
Регистрация: 16.05.2020
Сообщений: 57
По умолчанию

Код:
var n := ReadlnInteger('N ='); // количество костяшек
var yes: boolean; // флаг, собрана ли цепь из N костей?
var m := new boolean[7,7]; // матрица смежности имеющихся костяшек
var cep := new integer[n*2];// сборка очередной цепи перебором
var p, pMax: integer; // указатель на хвост цепи/длина макс.цепи
var best: array of integer; 

// более длинная цепочка запоминается в массиве best
procedure Save_Cep;
begin
  if p > pMax then (best, pMax, yes) := (cep[:p], p, p div 2 = n);
end;

// сущеуствуют ли еще подходящие костяшки?
function Exist(f: integer): boolean; // := (0..6).Any(s -> m[f,s])
begin
 for var s := 0 to 6 do
   if m[f,s] then Result := true;
end;

// построение цепочек 
procedure Make_Cep(f: integer);
begin
  if yes then exit; // использованы все N костей
  var (zero, six) := if m[f,f] then (f,f) else (0,6); //дубль без перебора 
  for var s := zero to six do  //бэк-трекинг поиска следующей
    if m[f,s] then begin
      (cep[p], cep[p+1]) := (f, s); 
      (m[f,s], m[s,f]) := (false, false); // убираем кость
      p += 2;
      if Exist(s) then Make_Cep(s) else Save_Cep;
      p -= 2;
      (m[f,s], m[s,f]) := (true, true); // возвращаем кость
    end;
end;

begin //следующая строка то же что и: for var f := 0 to 6 do for var s := f to 6 do |f,s| запиcать в массив
 (0..6).SelectMany(f -> (f..6).Select(s -> |f,s|))  //генерация 28 костей
 .toArray.Shuffle[:n].Println //перемешивание и срез первых n костей
 .ForEach(\(f,s) -> begin (m[f,s], m[s,f]) := (true, true) end);//запись их в m
  
 for var j:=0 to 6 do make_cep(j); //стартуем в поисках кости с цифрой j 
 
 best.Batch(2).Println.Count.Println //вывод результата
end.

Последний раз редактировалось canadamoscow; 06.06.2021 в 01:15.
canadamoscow вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать перемешивание костяшек в игре "15" BF_KARATEL Microsoft Office Excel 1 18.12.2012 13:38
Ассемблер. Цепочки символов corner Помощь студентам 0 18.11.2012 15:27
Динамические цепочки! kvantus123 Помощь студентам 3 13.05.2012 18:12
Цепочки _Val_ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.12.2010 16:29