二维数组中的闭合路径

时间:2011-08-27 10:08:32

标签: c# algorithm

存在零和一维的二维数组。需要算法(实现)确定在这个数组中是否封闭了一个包围零的路径

示例:

存在一条封闭的路径(中心):

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

4 个答案:

答案 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;
    }