유효한 미로의 수


12

WxH그리드가 주어지면 가능한 미로는 몇 개입니까?

미로에 대해 알고있는 것 :

  1. 격자는 정확히 H제곱 높이와 W제곱 너비입니다.
  2. 정사각형에는 시작, 완료 및 비우기의 세 가지 유형이 있습니다. 미로는 정확히 1 개의 시작과 1 개의 마무리를 포함해야하며 나머지 모든 사각형은 비어 있습니다.
  3. 전체 미로를 둘러싸는 벽이 있습니다.
  4. 아래 규칙을 위반하지 않는 한 벽은 두 사각형 사이의 가장자리에 존재할 수 있습니다.
  5. 시작 사각형에서 끝 사각형까지의 경로가 있어야합니다.

따라서, 두 숫자를 주어진, W그리고 H, 당신은 가능한 광장 / 벽 구성의 수를 나타내는 하나의 수를 반환해야합니다. 당신은 보장W*H > 1

예를 들어, 2x2미로는 100가능한 구성 이 정확히 다릅니다.

이것은 이므로 최단 답변이 승리합니다!


크기 및 / 또는 런타임에 제약이 있습니까? 누군가가 카운트를 효율적으로 계산할 수있는 알고리즘을 찾지 못하면 (거칠게 보임) 대부분의 솔루션에 지수 런타임이있을 것으로 기대합니다. 즉, 그것들은 심지어 중간 크기로도 붕괴 될 것입니다.
Reto Koradi

@RetoKoradi 아니요, 런타임 제약 조건이 없습니다. 제약 조건으로 인해 문제가 불가능한지 확실하지 않습니다.
나단 메릴

답변:


3

파이썬 2, 329310 바이트

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.