“解除我的封锁”难题表示

-2 投票
2 回答
749 浏览
提问于 2025-05-01 14:04

我正在尝试实现一个程序,来解决“解锁我”这个拼图游戏。对于那些不太了解的人来说,“解锁我”是一个滑动方块的拼图,棋盘上有1x1、1x2、2x1和2x2的方块,目标是把红色方块移动到棋盘外的一个开口处。

我想知道如何表示棋盘的状态。我在网上查了一下,发现有个建议是这样表示状态。

比如这个棋盘:棋盘状态

表示方式:网格表示

我能理解这种表示方式是怎么工作的。问题在于,当我想移动某个方块时,我该如何检查这个方块是1x1、1x2、2x1还是2x2,以便判断这个移动是否可行呢?

有没有什么想法可以帮我解决这个问题,或者有没有其他更简单的表示方式?

暂无标签

2 个回答

0

你可以创建一个和“网格”大小一样的数组,出口用一个特殊的值 -1 表示,空白的格子用 0 表示,每个方块则用它的编号来表示。

然后,你可以写一个检查函数,这个函数接收一个方块编号和一个方向。对于每个当前单元格,如果它的值是这个方块编号,就检查它旁边的单元格,看看是不是同样的方块编号,或者是小于 1 的值。

移动函数会把值按照需要的方向移动,并把原来的位置设置为 0。只要注意操作的顺序,你可以先把第一个需要移动的单元格设置为目标值,然后把当前的格子设置为 0。这样只需要很少的条件判断和几个循环。

3

我会这样做:

  • 网格的宽度
  • 网格的高度
  • 盒子的列表,每个盒子包括:
    • 盒子的尺寸(不一定是正方形或长方形)
      • 盒子的宽度
      • 盒子的高度
      • 盒子内占用的每个单元格
    • 左上角单元格的位置,也就是坐标(x, y)
    • 盒子的名称(例如,“A”、“B”、“C”)

如果这是一个需要将盒子滑出网格的解谜游戏,你还需要:

  • 出口所在的网格单元格的坐标
  • 该单元格出口的位置(例如,“北”、“东”等)。当出口位于角落单元格时,这一点是必要的。

这样你就可以进行必要的计算了。给定盒子所在的左上角单元格、盒子的尺寸以及盒子内占用的单元格,你可以计算是否发生了碰撞。

以上的表示方式也支持任意形状,而不仅仅是矩形和正方形。

撰写回答