i有一个2D阵列(n * m(作为二手点(起点(的画布和坐标。我必须计算,从画布外面,洪水不可能有多少点。字段只能在4个方向上进行,并且有三种类型的点:免费,实地,使用。二手点不是字段,并且字段不忽略它。因此,无法实现的点是n*m field-offield startingpoints。
现在我这样做了:我从边界的每个点上都用堆栈进行洪水,我计算了多少点。
但这对于画布不可用,尺寸为10^18*10^18。这想要大量的内存,我必须找到比使用这种经典的洪水更好的解决方案。
有人可以帮助更好的解决方案吗?
您可以在其头上翻转问题,并通过使用Polygon Technique中的点来搜索在字段中出现的点。
一旦确定了这一点,就可以从它开始进行洪水填充。如果洪水填充曾经触及边界,那么您的观点和此洪水填充填充的所有点都会从候选人中丢弃,因为这些是 fieldable 。
您通过查找尚未填充的字段中的点来重复此过程。
在每个洪水填充时,您都会保留填充点的数量,如果给定洪水填充饰面,没有一个叶子在边界上,您包括填充不可固定点<的填充计数>的填充计数>。
我不是100%确定我要什么。
我想象的是迷宫之类的东西,外部边缘有多个可能的起点,您想知道可以从外部访问/填充的所有可能的区域?
使其更有效的解决方案是缓存值,因此您不会重新计算已经计算的填充物。
制作其他尺寸相等的2D数组以跟踪已经填充的点。
类似 byte[][] filledPoints = new byte[n][m];
用0
初始化的意思是未填充。
例如:
final byte UNFILLED = 0;
final byte RED = 1;
final byte BLUE = 2;
当您进行填充时,对于每个点,您都会用"填充色"访问该点,以说已经计算出来。
例如。filledPoints[0][1] = RED
但是,在进行填充时,如果您要开始的点已经填充,那么您即将完成的整个填充已经通过以前的填充计算。
if(filledPoints[x][y] != UNFILLED){
// Then this fill was already filled with the color of filledPoint[x][y]
}
因此,如果它已经计算出来,那么您就不需要再次计算它,因此请继续进行下一个起点,您想尝试填充并检查是否已经填充。
当您找到尚未填充的填充区域时,然后开始用新的"颜色"填充它,然后跟踪填充的区域。
例如。filledPoints[0][386] = BLUE
当然,不可灌输的区域当然是所有洪水填充区域的总和。