检查2d矩阵上选择的图块是否全部连接

时间:2017-01-26 21:24:40

标签: java arrays algorithm matrix tile

我正在创建一个带有[100 tile x 100 tile]矩阵的地图的游戏。玩家可以通过组合4个瓷砖来创建“Duchies”。游戏将让玩家选择4个牌并检查这些牌是否全部相互连接,让玩家只有在他们是这样的情况下才能创建公爵。

因此我的isConnected()方法将采用ArrayList<Tiles>,并且图块具有getX()getY()方法,这些方法会返回网格上的X和Y坐标。如果切片相互连接,则返回true,否则返回false。 请注意,瓷砖无法对角连接

值得一提的是,该方法需要适用于具有4个以上图块的ArrayList的图块,因为它需要检查更大的图块列表,并且Duchy场景是如何使用该方法的示例。 / p>

只是想象整个事情;

示例输入1(X是选定的图块):

[X][X][X][ ][ ]
[ ][X][X][ ][ ]
[ ][ ][X][ ][ ]
[ ][ ][X][ ][ ]
[ ][ ][ ][ ][ ]

示例输出1:

true

示例输入2(X是选定的图块):

[X][X][X][ ][ ]
[ ][X][X][ ][ ]
[ ][ ][ ][X][X]
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]

示例输出2:

false

我想把所有的瓷砖逐一地比较所有其他瓷砖并假设如果所有瓷砖都连接到至少一个其他瓷砖,瓷砖全部连接,但意识到它不会工作,因为它会返回true像这样的东西:

[X][X][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ]
[ ][ ][X][X][ ]
[ ][ ][ ][ ][ ]

我无法找到一种方法来做到这一点,我无法在网上找到解决此类问题的方法。

1 个答案:

答案 0 :(得分:2)

洪水填充算法的排序;获取其中一个图块并递归地消耗选择中的相邻图块。如果选择中的所有切片都以这种方式消耗,则所有选定的切片都会连接。

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);
}