存在零和一维的二维数组。需要算法(实现)确定在这个数组中是否封闭了一个包围零的路径
示例:
存在一条封闭的路径(中心):
1 0 0 0 0
0 0 1 0 0
0 1 0 1 0
0 0 1 1 0
0 0 1 0 0
没有
0 0 0 0 1
0 1 0 1 0
0 0 1 0 0
0 0 1 0 1
0 1 0 1 0
答案 0 :(得分:3)
您可以查看连接组件标签算法,例如在Wikipedia或谷歌为他们。例如,使用这些算法。将前景像素与数字白/黑图像中的背景像素分开。要将它们应用于您的特定问题,您可以将矩阵视为数字图像,其中0表示前景,1表示背景(反之亦然,根据您的需要)。该算法找到被背景(1)包围的最大连通前景区域(仅包含0)。所以,如果你找到了这样一个前景区域,你知道它周围有一个1的周期。当前景区域位于边界时,您可以决定是否将其视为包围或不包围。
答案 1 :(得分:1)
这是家庭作业,所以我只是给出一般草图。构造无向图;每个1
都是一个节点,相邻的1
之间有一条边。 Google undirected graph cycle detection
找到封闭路径。然后你必须回到原始矩阵并确保里面至少有一个0
。
答案 2 :(得分:1)
另一个想法是从0
所限定的每个1
开始填充洪水。如果它没有到达边缘,它就会被包围。
答案 3 :(得分:0)
这是我试过的示例代码。测试一下 我试过的逻辑循环遍历除第一行和最后一行之外的所有行。 如果你找到0,那么如果所有邻居都是1则关闭它,然后将其检查为左,右,上和下。然后关闭。
private void Form1_Load(object sender, EventArgs e)
{
int[,] graph = new int[5, 5] {
{ 1, 0, 0, 0, 0 },
{ 0, 0, 1, 0, 0 },
{ 0, 1, 0, 1, 0 },
{ 0, 0, 1, 1, 0 },
{ 0, 0, 1, 0, 0 }
};
int[,] graph1 = new int[5, 5] {
{ 0, 0, 0, 0, 1 },
{ 0, 1, 0, 1, 0 },
{ 0, 0, 1, 0, 0 },
{ 0, 0, 1, 0, 0 },
{ 0, 1, 0, 1, 0 }
};
isClosed(graph1);
}
private bool isClosed(int[,] graph)
{
for (int i = 1; i < graph.GetUpperBound(0); i++)
{
for (int j = 1; j < graph.GetUpperBound(1); j++)
{
if (graph[i, j] == 0)
{
if (graph[i - 1, j] == 1 && graph[i + 1, j] == 1 && graph[i, j - 1] == 1 && graph[i, j + 1] == 1)
{
return true;
}
}
}
}
return false;
}