php Peg Puzzle解算器超时
第一次来这里。
我正在使用递归开发Peg Puzzle php求解器。对于小型和简单的开发板,我得到了预期的结果(脚本正确解决了难题),但是对于大型和完整的开发板(即,除了一个插槽之外的所有插槽),我得到了php超时。我需要使其与具有以下布局的7x7板一起使用:
x x 1 1 1 x x
x x 1 1 1 x x
1 1 1 1 1 1 1
1 1 1 0 1 1 1
1 1 1 1 1 1 1
x x 1 1 1 x x
x x 1 1 1 x x
\'x \'不可用的情况下,\'1 \'是带有钉子的插槽,\'0 \'是一个空闲插槽。
该板由7x7阵列(阵列的阵列)表示。我一次遍历一个键,进行以下检查:
此键的值是否为'1 \'?
如果是,则以下键的值也为'1 \'还是以下键'0 \'吗? (这意味着要钉住,并且有一个空间可以移动第一个)。
如果是,那么我将创建电路板的副本并应用这些更改,然后将其重新发送给功能。
如果没有,我朝另一个方向检查(当前检查顺序为:右,左,上,下)。
当脚本无法从该位置找到有效路径时,递归结束。
然后,我进行检查以查看是否只剩下一个钉子(这意味着该板已解决),或者是否还有钉子(这意味着该板尚未解决)。在后者中,应丢弃整个路径。
我将复制并粘贴我的代码,但是由于仍然有些混乱,我更愿意对其进行解释。
我尝试了Rodolphe Courtier的算法(在这里),结果相同。
提前致谢!
编辑:好的,到目前为止,使DFS非递归并没有太大帮助(仍然涉及很多步骤)。因此,现在我正在考虑检查板上的模式,这些模式首先会产生无法解决的难题,如果是这种情况,我会指示脚本不要一开始就遍历它。和以前一样,将发表我的发现。
没有找到相关结果
已邀请:
2 个回复
骨酚柯
每个位置都映射到16位int上的一位。电路板从p1以外的所有位开始。 “移动”是三位的三元组。例如,(p1,p2,p4)是可能的移动。如果将p1,p2位置1并将p4清零,或者将p2,p4设为1并将p1清零,则移动为“合法”。这里有所有动作的查找表,以及合法动作的定义。 为了进行深度优先搜索,我们需要: 结束状态(一点点:我通过将其定义为仅p1来“欺骗”,这是微不足道的) 进行和撤消移动(将当前板与候选移动进行异或运算,这同样是微不足道的) 生成一组候选移动(再次,一些二进制异或和和运算。唯一复杂的部分,如果需要的话,我可以稍后详细说明...) 代码:
掏得透垦滩