确定块是否可以在网格空间中移动

时间:2017-10-23 01:31:18

标签: c++ algorithm

我有一个块大小为1x1,2x2或3x3。它坐在一个有不同颜色空间的网格上。块可以在点(x1,y1)和(x2,y2)之间移动的唯一时间是两个点之间没有空格,这两个点具有不同的颜色。有关块可以移动的示例,请参见附图。

enter image description here

我的斗争表明我无法在我的c ++代码中找到适当的算法来找出该块是否可以在两个点击点之间移动。关于这将如何工作的任何建议?

上面发布的示例图片中的另一个例子,2x2块不能向下移动到(0,3),因为路上有一个蓝色块。

可以在水平,垂直或对角线方向上移动块。 这些块可以一次移动几个空格,只要它们不与相同的颜色相交即可。

2 个答案:

答案 0 :(得分:0)

让我们只考虑水平运动。因此,假设您希望2x2块从(0,0)移动到(3,0)。请注意,您可以在网格上想象一个矩形([left,top] - [right,botton]),它是通过从(0,0) - (4,1)收敛一个区域而形成的。要查看是否可以移动,您只需要在此区域上进行交互,以查看所有颜色是否相同。

这同样适用于垂直移动,使用相同的推理。

要完成对角线移动,你可以想象它是由小的水平和垂直移动形成的。

答案 1 :(得分:0)

看起来Lee's algorithm在这里很有用。

想象一下,你在一个节点上有一桶水,你已经将它撞倒了。水流开始在所有相邻节点上进一步扩散(基本上,它是breadth-first search)。可能有墙壁和井(不同颜色的节点),这可以防止水扩散。

您可以轻松检测水流何时到达目标节点,并且可以从中重建路线。如果它不可能,它会让你知道它。

在每个节点上,检查相邻节点的颜色,并将当前节点标记为有效/无效并访问。

主要问题是内存消耗。但是,Lee的算法有很多优化版本,例如,考虑this link