哈希表搜索背后的逻辑可能是鼓舞人心的。
提醒我们哈希表:
n
在哈希表中搜索时
- 我们先看看哈希函数在
h(n)
哪里。h
- 如果命中则报告记录,如果未命中则移动到 h(n)+1。
- 如果命中则报告记录,如果未命中则移至 h(n)-1。
- 如果命中则报告记录,如果未命中则移动到 h(n)+2。
- 如果命中则报告记录,如果未命中则移至 h(n)-2。
- 如果命中则报告记录,如果未命中则移动到 h(n)+4。
- 如果命中则报告记录,如果未命中则移至 h(n)-4。
- ...
我们将步长设置为 2^i 序列中的数字及其负数 (0,1,-1,2,-2,4,-4,8,-8,16,...)
现在在您的场景中:
- 我们先看看目标位置在
t
哪里。t
- 如果它是免费的,请报告该位置,如果不是,请移至 [tx,t.y+1]。
- 如果它是免费的,请报告位置,如果不是,请移至 [tx,ty-1]。
- ...
- 如果它是免费的,请报告位置,如果不是,请移至 [tx-1,ty-1]。
- 如果它是免费的,请报告该位置,如果不是,请移至 [tx,t.y+2]。
- ...
- 如果它是免费的,请报告该位置,如果不是,请移至 [tx,t.y+4]。
- ...
现在我们如何判断一个位置是否免费?您可以创建一个实际的哈希表来存储其中的所有对象位置。现在,当您需要检查 [x,y] 周围的空闲位置来放置石头时,您必须在哈希表中搜索h(x,y)
.
如果您需要在位置 [x,y] 放置一个更大的对象,例如 3x3 圆形喷泉,您还需要检查这些记录h(x+1,y), h(x-1,y), h(x,y+1), h(x,y-1)
:由于它是一个圆形物体,您可以近似该区域以简化并因此h(x+1,y+1), h(x+1,y-1), h(x-1,y+1), h(x-1,y-1)
从您的搜索中删除四个相对位置。
之后,您应该将所有这些位置添加到哈希表中,以便以后更容易找到占用的位置。例如,添加一个 3x3 对象需要在哈希表中添加 9 条记录。
请注意,哈希函数应该反映二维(或三维)世界。例如, y 轴上世界的最大尺寸在h(x,y) = x*N + y
哪里。N