有効な迷路の数


12

与えられたWxHグリッドを、どのように多くの可能な迷路がありますか?

迷路について知っていること:

  1. グリッドのH高さは正確に正方形で、W幅は正方形です。
  2. 開始、終了、空の3つのタイプの正方形があります。迷路には、開始と終了がそれぞれ1つだけ含まれている必要があり、残りのすべての正方形は空です。
  3. 迷路全体を囲む壁があります。
  4. 以下の規則に違反しない限り、壁は任意の2つの正方形の間のエッジに存在できます。
  5. 開始広場から終了広場までのパスが存在する必要があります。

したがって、との2つの数値を指定するWH、可能な正方形/壁構成の数を表す単一の数値を返す必要があります。あなたは保証されています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で問題を議論しているときに使用していたプログラムのゴルフ版(およびより非効率的な)バージョンです。いくつかのスペースのインデントをタブに置き換えることで数バイト節約できますが、後で使用するために保存します。

アルゴリズムは単純にすべての迷路を生成し、開始点から塗りつぶし、ある時点で終了点を通過するかどうかを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.