java - 检查二维矩阵上的所选图 block 是否全部连接

标签 java arrays algorithm matrix tile

我正在创建一个游戏, 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/

相关文章:

algorithm - 存在大量重复项时二分查找算法的性能

java - 上下文根的 Web.xml 安全约束不适用

java - 将对象转换为泛型类型失败

swift - Swift 中非常慢的扫雷递归算法

regex - 构建正则表达式编写器

ios - 如何在 Swift 中按条件组合数组中的对象?

java - 尝试将 Java 字符串中的每个单词大写

java - CouchbaseClient 如何获取存储桶中所有 DesignDocuments 的列表

java - reduce() 不适用于 lightcouch

java - 子对象数组