Кількість дійсних лабіринтів


12

З урахуванням WxHсітки, скільки можливих лабіринтів?

Що ви знаєте про лабіринт:

  1. Сітка точно Hрівних квадратів, а Wквадрати шириною.
  2. Існує три типи квадратів: Початок, Завершення та Порожній. Ваш лабіринт повинен містити рівно 1 Початок і 1 Фініш, а всі залишилися квадрати порожні.
  3. Є стіни, що оточують весь лабіринт.
  4. Стіни можуть існувати на краю між будь-якими двома квадратами, якщо це не порушує наведене нижче правило:
  5. Має існувати шлях від Стартової площі до площі Фінішу.

Тому, задавши два числа, Wі Hви повинні повернути одне число, що представляє кількість можливих конфігурацій квадрат / стіна. Вам це гарантованоW*H > 1

Наприклад, 2x2лабіринт має абсолютно 100різні можливі конфігурації.

Це тому найкоротша відповідь виграє!


Чи є обмеження щодо розміру та / або часу виконання? Якщо хтось не знайде алгоритм, який зможе ефективно підрахувати підрахунок (який виглядає важко), я сподіваюся, що більшість рішень матимуть експоненціальний час виконання. Це означає, що вони будуть вибухати навіть при помірних розмірах.
Рето Коради

@RetoKoradi немає, обмежень для виконання немає. Я не впевнений, чи обмеження можуть зробити проблему неможливою чи ні.
Натан Меррілл

Відповіді:


3

Python 2, 329 310 байт

from itertools import*
w,h=input()
R=range(w*h)
p=product
n=0
Z=[(x,y)for x,y in p(R,R)if abs(x%w-y%w)+abs(x/w-y/w)<2]
for s,f,W in p(R,R,p(*[((),z)for z in Z if z[0]<z[1]])):
 V={s};C=[s];v=0
 while C:
  c=C.pop();v|=c==f!=s;V|={c}
  for o,q in Z:C+=(c==o)*len({q,(o,q),(q,o)}-(V|set(W)))/3*[q] 
 n+=v
print n

Це гольф (і набагато неефективніша) версія програми, яку я використовував під час обговорення проблеми з @Nathan. Я можу зберегти кілька байтів, замінивши відступ простору на вкладки, але збережу це на потім.

Алгоритм просто генерує кожен лабіринт, а потім заповнює заливку з самого початку, бачачи, чи пройдемо ми фініш в якийсь момент чи ні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.