假设我们有一个二进制矩阵(0或1,无论如何),其中0表示未占用,1表示占用。矩阵随机填充这些值。
我知道所有被占用的点,但不知道那些不是那些......也就是说,我可以获得一系列被占用的点,但不是那些不被点的点。
从矩阵中获取随机非占据点的最有效方法是什么?
我试过在矩阵中得到一个随机点,如下所示:
x = random number from 0 to maxX
y = random number from 0 to maxY
while (x, y) is occupied:
x = random number from 0 to maxX
y = random number from 0 to maxY
return (x, y)
这是最好的运行时间,没有什么,最坏的情况是永远的。
我尝试过的另一件事是
point[] unoccupied
for each y in matrix
for each x int matrix
if (x, y) is unoccupied
push (x, y) to unoccupied
shuffle unoccupied
return unoccupied[0]
这具有至少为O(x * y)的时间复杂度。大部分时间它比第一种方法慢,但它更稳定。
这项任务很简单,但有更有效的方法可以实现这一目标吗?
这不是任何类型的家庭作业或那种。我正在实施一个类似蛇的游戏,并试图将一个新的苹果/饼干放到一个空置的地方。
答案 0 :(得分:2)
我建议您使用Quadtree。通过这种方式,您可以跟踪已占用的单元格,同时可以轻松找到未占用的区域。四叉树上的大多数操作都是矩阵大小的O(log n)。
答案 1 :(得分:0)
使用随机,如果被占用,则迭代地递增x和y,直到到达未占用的单元格。