有效迷宫数


12

给定一个WxH网格,有多少种可能的迷宫?

您对迷宫的了解:

  1. 网格正好是H正方形,W正方形是正方形。
  2. 共有三种类型的正方形:“开始”,“完成”和“空”。迷宫必须正好包含1个开始点和1个结束点,所有剩余的方块均为空。
  3. 整个迷宫周围都有墙壁。
  4. 除非违反以下规则,否则墙可以存在于任意两个正方形之间的边缘上:
  5. 从开始方块到完成方块必须存在一条路径。

因此,给定两个数字WH,您必须返回一个数字,代表可能的正方形/墙壁配置的数目。您保证W*H > 1

例如,2x2迷宫具有完全100不同的可能配置。

这是一个所以最短的答案是成功的!


在大小和/或运行时间上是否有任何限制?除非有人找到一种可以有效计算计数(看起来很难)的算法,否则我希望大多数解决方案都将具有指数级的运行时间。意思是,它们将以中等大小爆炸。
Reto Koradi

@RetoKoradi否,没有运行时约​​束。我不确定约束是否会使该问题无法实现。
内森·美林

Answers:


3

Python 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讨论问题时使用的程序的高尔夫版本(效率更低)。我可以通过用制表符替换一些空格缩进来节省一些字节,但是我会保存下来供以后使用。

该算法只是生成每个迷宫,然后从头开始填充,看看我们是否在某个时候通过了终点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.