我正在创建一个游戏, map 是 [100 tile x 100 tile] 矩阵。玩家将能够通过组合 4 个方 block 来创建“公国”。游戏会让玩家选择 4 个方 block 并检查这些方 block 是否全部相互连接,只有当它们连接在一起时才允许玩家创建公国。
所以我的isConnected()
方法将采用 ArrayList<Tiles>
瓷砖有getX()
和 getY()
方法,它返回它们在网格上的 X 和 Y 坐标。如果方 block 相互连接,则返回 true,否则返回 false。 请注意,瓷砖不能对角连接。
值得一提的是,该方法需要适用于 ArrayList 中超过 4 个图 block 的图 block ,因为它需要检查更大的图 block 列表,而公国场景就是该方法的使用示例。
只是为了形象化整个事情;
示例输入 1(X 是选定的图 block ):
[X][X][X][ ][ ]
[ ][X][X][ ][ ]
[ ][ ][X][ ][ ]
[ ][ ][X][ ][ ]
[ ][ ][ ][ ][ ]
示例输出 1:
true
示例输入 2(X 是选定的图 block ):
[X][X][X][ ][ ]
[ ][X][X][ ][ ]
[ ][ ][ ][X][X]
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]
示例输出 2:
false
我想过将所有图 block 与所有其他图 block 一一比较,并假设如果所有图 block 都连接到至少一个其他图 block ,则所有图 block 都已连接,但我意识到这行不通,因为它会返回 true像这样:
[X][X][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][X][X][ ]
[ ][ ][ ][ ][ ]
我想不出解决这个问题的方法,也找不到在线解决此类问题的方法。
最佳答案
有点像洪水填充算法;获取其中一个图 block 并递归地消耗选择中的相邻图 block 。如果选择中的所有图 block 都以这种方式消耗,则所有选定的图 block 都已连接。
boolean isConnected(List<Tile> selection) {
if (selection.isEmpty())
return true; // ?????
Queue<Tile> toConsume = new LinkedList<>(selection);
Queue<Tile> queue = new LinkedList<>();
queue.add(toConsume.remove());
while (!queue.isEmpty() && !toConsume.isEmpty()) {
Tile tile = queue.remove();
findNeighbours(tile, toConsume)
.forEach(n -> {
toConsume.remove(n);
queue.add(n);
});
}
return toConsume.isEmpty();
}
List<Tile> findNeighbours(Tile tile, Collection<Tile> tiles) {
return tiles.stream()
.filter(t -> distance(t, tile) == 1)
.collect(Collectors.toList());
}
int distance(Tile a, Tile b) {
int dx = a.getX() - b.getX();
int dy = a.getY() - b.getY();
return Math.abs(dx) + Math.abs(dy);
}
关于java - 检查二维矩阵上的所选图 block 是否全部连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883238/