【发布时间】:2015-11-20 17:21:51
【问题描述】:
众所周知,方位网格的排列可以使用蛮力算法计算,其中从 0...((2^cells)-1) 的整数循环可以转换为每个网格排列使用一个位掩码。几个例子:
Grid size 2 (4 cells): 0-->15
Grid size 3 (9 cells): 0-->511
这对于达到一定大小的网格效果很好,但对于大小为 7 或更大的网格,循环操作的绝对数量会达到数万亿。
还有哪些其他选择?
我已经有最大为 6 的网格的工作代码,但一个快速的Fermi estimate 有一个大小为 7 的网格,在我的工作站上大约 76 年出现,所有 CPU 最多...:-(
目标应用
关于所述网格的实际应用,这与Nurikabe puzzle 几乎相同,但我只对可以在其 X 或 Y 轴(最好是两者)上镜像的网格感兴趣。所以一些合适的图案可能是菱形 (X & Y)、字母 D (Y) 或字母 A (X)。
现有效率
由于目标应用程序的变幻莫测,有很多候选人可以被丢弃:
- 那些不在网格边缘创建单元格的方法
- 无法跨 X 或 Y 轴镜像的那些
- 细胞被分离的地方
样本输出(N=4)
Current value is : 28662
##
####
####
##
Current value is : 40953
# #
####
####
# #
Current value is : 63087
####
##
##
####
Current value is : 63903
####
# #
# #
####
Current value is : 65535
####
####
####
####
Grid size 4, done in 22 milliseconds
【问题讨论】:
-
您是否尝试生成所有可能的网格?
-
对不起,什么是位 grid ?你的意思是位 array 吗?
-
抱歉,是的 - 位数组。
-
@MichaelSPriz 由于我正在处理网格,它只是其中的一小部分,因为我希望所有形状都接触网格的侧面。因此,鉴于最后一行必须有一些东西,实际上我可以从左下角的位值开始(例如 4096 用于 4x4 网格)。
标签: algorithm language-agnostic