作为我正在进行的项目的一部分,我想将含有水的瓷砖划分为“海洋”和“湖泊”。这是通过首先找到 map 边缘的所有水图块,并将它们指定为“海”图块来完成的。所有与海块相邻(没有对角线)的水块也是海块。所有其他水瓷砖都是“湖”瓷砖。
我找到第一个海瓦(在板的边缘)的方法没有缺陷。然而,我寻找其他海块的方法通常会遗漏应该是海的大矩形区域。代码如下:(seed
是一个 bool 数组,其中 true
是陆地,false
是水,seas
是另一个 bool 数组,其中 true
是海瓦而 false
不是)
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;
}
}
}
我一生都找不到这段代码中的错字,也许一双新的眼睛会有所帮助?
我的代码的下一步是找到所有不是海瓷砖的水瓷砖,并将它们指定为湖瓷砖。这是通过以下代码段完成的:(
seas
和 seed
与上面相同,lakes
是一个 bool 数组,其中 true
是湖瓦片而 false
不是)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;
}
}
}
这是另一个可能的错误来源,但我再一次不知道它是如何被破坏的。
附件是基于生成的三个 bool 数组生成的图像。绿色是陆地板块,蓝色是海洋板块,而浅蓝色(或浅蓝色)是湖板块。如您所见,有大片水域与海瓦相邻,它们也应该是海瓦,但却是湖瓦。
先感谢您。
最佳答案
作为一个凌乱的数学解决方案,您可以重复第一个代码块 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;
}
}
}
}
关于c# - 我用于检查某物是否与某个点相邻的算法存在问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37123159/