解决4x4拼图网格

时间:2016-01-22 00:45:36

标签: java multidimensional-array 8-puzzle

我正在尝试创建一个程序,该程序将根据以下规则找到解决难题的步骤:

  • 给定4x4网格中的任何颜色集,尝试匹配具有相同颜色数的结束图案。
  • 不交换颜色,但水平或垂直旋转,以便

{W,W,B,W}

可以旋转到

{W,W,W,B}

{B,W,W,W}

{W,B,W,W}

  • 整个谜题可以在不到16个步骤中解决。

我已经想出了如何存储拼图本身的数据,但我正在努力寻找可以显示步骤的解决方案。由于深度限制为16个步骤,我可以尝试暴力破解,但实际上并不知道如何建立模式。

这类似于解决Rubik的立方体,我已经查看了以下资源:

  • stackoverflow.com/questions/34656587/solving-rubiks-cubes-for-dummies/34656726#34656726

  • stackoverflow.com/questions/5563671/solving-rubiks-cube-programmatically

  • amzi.com/articles/rubik.htm

  • chessandpoker.com/rubiks-cube-solution.html

和15号码问题

  • stackoverflow.com/questions/3621623/how-to-programatically-solve-the-15-moving-numbers-puzzle

要使这个问题尽可能清楚:a)存储/打印步骤的好方法是什么,以及b)找到采用最少步骤的解决方案?

1 个答案:

答案 0 :(得分:0)

我想我无法解释没有照片的树。

假设您有这种起始模式:

[W, W, W, B]
[W, W, W, B]
[B, W, W, W]
[W, W, W, B]

这将是树的顶级节点。等级0。

现在,我们做所有可能的水平和垂直旋转。首先是水平向右。

[B, W, W, W]
[W, W, W, B]
[B, W, W, W]
[W, W, W, B]

[W, W, W, B]
[B, W, W, W]
[B, W, W, W]
[W, W, W, B]

[W, W, W, B]
[W, W, W, B]
[W, B, W, W]
[W, W, W, B]

[W, W, W, B]
[W, W, W, B]
[B, W, W, W]
[B, W, W, W]

左侧水平。

[W, W, B, W]
[W, W, W, B]
[B, W, W, W]
[W, W, W, B]

[W, W, W, B]
[W, W, B, W]
[B, W, W, W]
[W, W, W, B]

[W, W, W, B]
[W, W, W, B]
[W, W, W, B]
[W, W, W, B]

[W, W, W, B]
[W, W, W, B]
[B, W, W, W]
[W, W, B, W]

垂直向上

[W, W, W, B]
[B, W, W, B]
[W, W, W, W]
[W, W, W, B]

[W, W, W, B]
[W, W, W, W]
[B, W, W, B]
[W, W, W, B]

垂直向下

[W, W, W, B]
[W, W, W, B]
[W, W, W, W]
[B, W, W, B]

[W, W, W, B]
[W, W, W, B]
[B, W, W, B]
[W, W, W, W]

由于第二列和第三列都是W,我们只有2种模式可以垂直向上和向下垂直。

我们在第1级总共有12种模式。

我们非常有条不紊地行动。我们的行动没有任何随机性。水平向右,水平向左,垂直向上,垂直向下。

现在,将12个模式中的每个模式都放在第1级并生成16个模式。您不必保存与0级和1级模式匹配的模式。

生成和保存的模式构成2级。

继续生成每个级别,直到达到16级或者您有解决方案。因为您要从树级别删除重复项,所以您不会达到理论上的最大值16到16级上的第16个电源节点。

如果有多个移动次数的解决方案,请完成关卡。