对于游戏(WPF),我需要创建一个地图编辑器。地图由4x3地图字段的矩阵定义。当用户编辑地图时,他可以启用和禁用每个字段,并定义地图的外观。现在,只有每个字段都连接到另一个字段时,地图才有效。即此地图有效(蓝色有效,灰色无效):
我有一个带有地图字段的二维数组。每个字段都有一个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个活动字段)。不幸的是,使用此方法,以下地图也是有效的:
但这些地图不应该有效。检查地图是否有效的最有效算法是什么?
答案 0 :(得分:1)
一对方法:
从任何活动单元格执行BFS,并在结束检查后标记所有活动单元格
使用union-find data structure(您不需要对此类小网格进行任何优化),插入带有活动邻居的活动单元格,并检查是否只有一个连接的组件