用于检查二维阵列中的连接邻居的算法

时间:2014-03-01 14:24:25

标签: c# algorithm

对于游戏(WPF),我需要创建一个地图编辑器。地图由4x3地图字段的矩阵定义。当用户编辑地图时,他可以启用和禁用每个字段,并定义地图的外观。现在,只有每个字段都连接到另一个字段时,地图才有效。即此地图有效(蓝色有效,灰色无效):

enter image description here

我有一个带有地图字段的二维数组。每个字段都有一个boolean值,用于定义它是否处于活动状态。要检查地图是否有效,我写了以下方法:

private bool IsMapPlayable()
{
    int numberOfActiveFields = 0;
    for (var row = 0; row < this.GameFields.Length; row++)
    {
        for (var col = 0; col < this.GameFields[row].Length; col++)
        {
            if (!this.GameFields[row][col].IsActive) continue;
            numberOfActiveFields++;

            if (!(row > 0 && this.GameFields[row - 1][col].IsActive)
                && !(row + 1 < this.GameFields.Length && this.GameFields[row + 1][col].IsActive)
                && !(col > 0 && this.GameFields[row][col - 1].IsActive)
                && !(col + 1 < this.GameFields[row].Length && this.GameFields[row][col + 1].IsActive)
                && numberOfActiveFields > 1)
            {
                return false;
            }
        }
    }

    return numberOfActiveFields > 0;
}

此方法仅检查每个字段是否具有直接活动邻居字段(并且具有正好1个活动字段或多于1个活动字段)。不幸的是,使用此方法,以下地图也是有效的:

enter image description here

enter image description here

但这些地图不应该有效。检查地图是否有效的最有效算法是什么?

1 个答案:

答案 0 :(得分:1)

一对方法:

从任何活动单元格执行BFS,并在结束检查后标记所有活动单元格

使用union-find data structure(您不需要对此类小网格进行任何优化),插入带有活动邻居的活动单元格,并检查是否只有一个连接的组件