【问题标题】:Checking if chosen tiles on a 2d matrix are all connected检查二维矩阵上选择的瓷砖是否全部连接
【发布时间】:2017-01-26 21:24:40
【问题描述】:

我正在使用 [100 tile x 100 tile] 矩阵的地图创建游戏。玩家将能够通过组合 4 个图块来创建“公国”。游戏将让玩家选择 4 个图块并检查这些图块是否都相互连接,并让玩家仅在连接时创建公国。

所以我的isConnected() 方法将采用ArrayList<Tiles> 并且图块具有getX()getY() 方法,它们返回它们在网格上的X 和Y 坐标。如果图块相互连接,则返回 true,否则返回 false。 注意,瓷砖不能对角连接

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


只是为了可视化整个事情;

示例输入 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][ ]
[ ][ ][ ][ ][ ]

我想不出办法来解决这个问题,也找不到在线解决此类问题的方法。

【问题讨论】:

    标签: java arrays algorithm matrix tile


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多