Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查某个点是否相邻的算法有问题_C#_Algorithm_Multidimensional Array - Fatal编程技术网

C# 检查某个点是否相邻的算法有问题

C# 检查某个点是否相邻的算法有问题,c#,algorithm,multidimensional-array,C#,Algorithm,Multidimensional Array,作为我正在进行的一个项目的一部分,我想将含有水的瓷砖分为“海”和“湖”。首先在地图边缘找到所有的水砖,并将它们命名为“海”砖。与海瓦相邻的所有水瓦(无对角线)也是海瓦。所有其他水砖都是“湖”砖 我找到第一块海瓦(在木板边缘)的方法没有瑕疵。然而,我寻找其他海瓦的方法常常遗漏了应该是海的大矩形区域。代码如下:(seed是一个布尔数组,true是陆地,false是水,seas是另一个布尔数组,true是海瓦,false不是) 这是另一个可能的错误来源,但我再一次对它是如何被打破感到困惑 附加是基于生

作为我正在进行的一个项目的一部分,我想将含有水的瓷砖分为“海”和“湖”。首先在地图边缘找到所有的水砖,并将它们命名为“海”砖。与海瓦相邻的所有水瓦(无对角线)也是海瓦。所有其他水砖都是“湖”砖

我找到第一块海瓦(在木板边缘)的方法没有瑕疵。然而,我寻找其他海瓦的方法常常遗漏了应该是海的大矩形区域。代码如下:(
seed
是一个布尔数组,
true
是陆地,
false
是水,
seas
是另一个布尔数组,
true
是海瓦,
false
不是)

这是另一个可能的错误来源,但我再一次对它是如何被打破感到困惑

附加是基于生成的三个布尔数组生成的图像。绿色是陆地瓷砖,蓝色是海洋瓷砖,浅蓝色是湖泊瓷砖。正如你所看到的,有大片水域与海瓦相邻,也应该是海瓦,而不是湖瓦。


提前谢谢。

作为一个混乱的数学解决方案,您可以重复第一个代码块N次(其中N等于长度变量N-1次,因为您第一次执行+-1检查)。原因是,您可能会跳转一些其邻居尚未标记但稍后将标记的瓷砖。因此,您必须稍后再来检查它的邻居是否被标记。显然,有更多的优化方法需要更少的过程

for (int z=0;z < length; z++){

for (int x = 0; x < length; x++)
{
    for (int y = 0; y < height; y++)
    {
        if (!seed[x, y])
        {
            if (x + 1 < length && seas[x + 1, y])
                seas[x, y] = true;
            else if (x - 1 >= 0 && seas[x - 1, y])
                seas[x, y] = true;
            else if (y + 1 < height && seas[x, y + 1])
                seas[x, y] = true;
            else if (y - 1 >= 0 && seas[x, y - 1])
                seas[x, y] = true;
        }
    }
}
}
for(int z=0;z=0&&seas[x-1,y])
海[x,y]=真;
否则如果(y+1<高度和海洋[x,y+1])
海[x,y]=真;
如果(y-1>=0&&seas[x,y-1])
海[x,y]=真;
}
}
}
}

通常情况下,我看到这种类型的检查是通过递归泛洪填充完成的。但现在深入研究您的代码。问题是您的代码按照给定的顺序(从上到下,然后从左到右)检查磁贴,而未知磁贴的sea[x,y]=false。所以,如果你有一块地砖,它的邻居都是陆地和未知的,你会把它标记为湖,即使它是海。如前所述,您必须使用洪水填充或BFS算法。请告诉我。同样,一个好的递归洪水填充可能会更优雅。不过,对于你的回答,我想知道仅仅扫描整个地图两次是否就足够了——或者也许只有当一个值实际发生变化时才足够。谢谢你引入洪水填充。在我建议的方法中,N-1时间递归是强制性的,因为邻居效应正在一个接一个地传播。一个简单的例子是一个垂直柱,它从底部开始,在到达地图顶部之前结束。谢谢。我最终使用了类似的方法。我希望避免递归,因为我希望能够创建大型(1000+x1000+)映射,而不必担心内存使用。
for (int x = 0; x < length; x++)
{
    for (int y = 0; y < height; y++)
    {
        if (!seed[x, y] && !seas[x, y])
        {
            lakes[x, y] = true;
        }
    }
}
for (int z=0;z < length; z++){

for (int x = 0; x < length; x++)
{
    for (int y = 0; y < height; y++)
    {
        if (!seed[x, y])
        {
            if (x + 1 < length && seas[x + 1, y])
                seas[x, y] = true;
            else if (x - 1 >= 0 && seas[x - 1, y])
                seas[x, y] = true;
            else if (y + 1 < height && seas[x, y + 1])
                seas[x, y] = true;
            else if (y - 1 >= 0 && seas[x, y - 1])
                seas[x, y] = true;
        }
    }
}
}