无论布局正在使用的瓷砖,是否有任何良好的方式瓜分了瓷砖,以便可保证的用户,在游戏开始时,至少存在一个路径完成这一难题,并赢得比赛?

很明显,取决于用户的移动,他们可以切断自己离胜利。我只是希望能够总是告诉用户的难题是打不赢的,如果他们玩。

如果你随意地砖在游戏的开始,这是可能的用户可以使一些移动和不能做任何的更多。知识是一个难题是至少可以解决的,应该使它更好的发挥。

有帮助吗?

解决方案

将所有瓷砖反向放置(即从中间开始布局,然后开始锻炼)

为了进一步取笑玩家,你可以以非常高的速度明显地做到这一点。

其他提示

反向玩游戏。

在你可以将它们滑入堆中的地方随机地逐对布置碎片。你需要一种知道的方法,你可以在哪里放置碎片,以便最终得到一个与预设模式相匹配的堆,但无论如何你都需要它。

我知道这是一个老问题,但是在我自己解决问题时遇到了这个问题。这里没有一个答案是完美的,其中一些有复杂的警告或将在病理布局上打破。这是我的解决方案:

使用未标记的图块解决板(向前,而不是向后)。一次删除两个免费的瓷砖。将您移除的每一对推到“匹配对”上。堆。通常,这就是你需要做的全部。

如果你遇到了死胡同(numFreeTiles == 1),只需重置你的发电机:)我发现我通常没有达到死胡同,到目前为止,10-的最大重试次数为3我试过的那种布局。一旦我重复8次,我就放弃并随意分配其余的瓷砖。这允许我使用相同的发生器来设置电路板和随机播放功能,即使播放器搞砸了并且处于100%无法解决的状态。

当你遇到死胡同的另一个解决方案是退出(弹出堆栈,更换板上的瓷砖),直到你可以采取不同的路径。通过确保匹配将删除原始阻止区块的对来采取不同的路径。

不幸的是,取决于电路板,这可能会永远循环。如果您最终删除一对类似于“无插座”的对道路,其中所有后续的“道路”是一个死胡同,并且有多个死胡同,你的算法永远不会完成。我不知道是否有可能设计一个可能出现这种情况的电路板,但如果有的话,仍有解决方案。

要解决这个更大的问题,请将每个可能的板状态视为DAG中的节点,每个选定的对都是该图上的边。进行随机遍历,直到找到深度为72的叶节点。跟踪您的遍历历史记录,以便永远不会重复下降。

由于死胡同比我使用的布局中的第一尝试解决方案更为罕见,因此立即想到的是混合解决方案。首先尝试用最少的内存来解决它(在堆栈上存储选定的对)。一旦达到第一个死胡同,在访问每个节点时会降级为完全标记/边缘生成(尽可能进行延迟评估)。

我对图论的研究很少,所以也许对DAG随机遍历/搜索问题有更好的解决方案:)

编辑:您实际上可以使用我的任何解决方案来反向生成电路板,在2008年10月13日发布。你仍然有同样的警告,因为你仍然可能最终死路一条。但是,反向生成板有更复杂的规则。例如,如果你没有至少开始一些中间的第一块,例如在长行的布局中,你可以保证你的设置失败。在前向求解发生器中采用完全随机(合法)的第一步更有可能导致可解决的电路板。

我唯一能想到的就是将瓷砖放在配对中,作为一种反向麻将纸牌游戏。因此,在平铺放置期间的任何时候,电路板应该看起来像是在真实游戏的中间(即没有瓷砖漂浮在其他瓷砖上方3层)。

如果在反向游戏中将棋子放置在匹配对中,则应始终至少生成一条前进路径来解决游戏。

我很想听听其他想法。

我相信最好的答案已被推高:通过解决它来创建一个集合“反向”。 - 即从空白板开始,然后在某处添加一对,在可解决的位置添加另一对,依此类推......

如果你更喜欢“大爆炸”方法(在开始时随机生成整个集合),是一个非常男子气概开发人员或者今天只是感受自虐,你可以代表你可以从给定集合中取出的所有对以及它们如何依赖于每个对其他通过有向图。

从那里,您只需要获得该集合的传递闭包,并确定是否至少有一条路径来自至少一个初始合法对,这些路径通向所需的末端(没有剩余的图块对)。 / p>

实施此解决方案留给读者:D

这里的规则我用我的执行情况。

当buildingheap,对于每个担心在一个对分开,找到一个细胞(地点),它们是:

  • 所有细胞中在较低的水平,已经充满了
  • 位于第二烦恼不会阻止第一,考虑到如果首先担心已经把船上的
  • 这两个地方是"边缘"已经建堆:
    • 或者至少具有一个邻居在左边或是右边
    • 或者它是第一个担心在一个行(所有小时左右被递归免费的)

这些规则并不能保证建立将始终成功--它有时候离开的最后2个免费的细胞阻止自行,并建立应该试(或至少去几苦恼) 在实践中,"海龟"内在没有更多的然后6次重试.

大多数的存在游戏似乎限制,把第一个("第一行")烦恼的地方在一个中间。这个拿出更多的方便配置,当有没有烦恼在边缘的很长一行,熬夜直到最后一个球员的移动。然而,"中间"是不同的不同的配置。

祝你好运:)

P.S.如果你找到algo,建立可以解决的堆在一转-请让我知道。

游戏中有144个图块,144个图块中的每一个都有一个阻止列表。 (堆栈顶部的磁贴有一个空的阻止列表)

所有有效的动作都需要他们的“current__vertical_Block_list”。是空的..这可以是144x144矩阵,所以20k的内存加上LEFT和RIGHT块列表,每个也是20k。

从(remaning_tiles)AND((空当前垂直块列表)和((空当前左侧块列表)或(空当前块列表))生成有效的移动表))

从有效移动表中挑选2个随机切片,记录它们 更新(当前表格Vert,left和right),将删除的Tiles记录到堆栈

现在我们有一个构成有效游戏的动作列表。为72个移动中的每个移动分配匹配的切片类型。

用于挑战游戏,跟踪每个磁贴何时可用。找到具有(早期早期早期)和(晚期较晚)的集合,因为它是空白的,您会找到2个LE块的1个EE 1 LL和2个LE块,找到一个早期阻止任何其他的(EARLY)(除了右侧封锁左侧部分)
一旦你有一个有效的游戏玩法订购。

纸牌?只是一个猜测,但我认为你的计算机需要击败游戏(或接近它)来确定这一点。

另一个选择可能是有几个预设布局(允许获胜,与你当前的水平混合。

在某种程度上,您可以尝试确保4个图块中的一个不超过另一个X下的X图层。

我看到的大多数游戏都会在有人卡住时发出随机播放命令。

我会尝试各种各样的事情,看看什么效果最好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top