检查网格中瓷砖的相邻性

时间:2020-10-11 18:49:28

标签: c# algorithm sliding-tile-puzzle

我正在研究sliding block puzzle求解器,我想将游戏扩展到具有任意边和各种形状的块的网格。我定义了一个具有给定高度和宽度的网格,然后将其转换为字典,以运行索引作为键,并将布尔值作为值(如果平铺位置则为true,否则为false)。

具有运行索引的示例:

|0|1|2|
|3|4|5|
|6|7|8|

示例块及其相应的字典(X表示平铺位置)

|0|1|X|
|3|X|X|
|X|X|8|

{
   0: false, 1: false, 2: true,
   3: false, 4: true,  5: true,
   6: true,  7: true,  8: false
}

当我计划随机创建块布局时,我想测试任意布局的有效性。要使一个块有效,要求之一就是所有图块都通过相邻的邻居连接。

有效块:

|X|X|X|
|X| |X|
|X| | |

无效的块(块1和5未连接):

|X|X| |
| | |X|
| | |X|

首先,我想我可以通过获取块中每个平铺位置的相邻索引列表并检查是否至少每个邻接列表中包括所有其他平铺索引来解决此问题。但是上面的无效示例已经是无法解决问题的情况。

如何检查所有图块是否相互连接?

PS:这个问题似乎与我使用的语言无关,但是由于我使用的是C#,因此为了确定起见,我将添加该标签。

1 个答案:

答案 0 :(得分:2)

您可以从任意图块开始并运行 DFS (深度优先搜索)。如果在DFS期间可以访问所有图块,则图块已连接。否则就不会。

这是一个伪代码

dfs(x,y):
   visited[x][y] = true
   for each position in your adjacency list: ## up,down,left,right
      if(visited[newX][newY]==false and grid[newX][newY] is a tile and newX , newY both is in the grid ):
          dfs(newX,newY)

基本上只是从一个图块开始,并且只要可能,就使用向左/向右/向上/向下移动,仅移动到另一个图块。如果未连接它们,则将在访问每个图块之前结束。

相关问题