与T2相比稍复杂的模拟题。
首先此题很显然是模拟每次的走动,但是暴力检查柱子会TLE。我们首先注意到如果当前 x/yx/yx/y 方向没有柱子,那么这个方向的移动不会受到任何影响。这启示我们使用 x,yx,yx,y 方向上的两个map来记录柱子所在的行或列。
如果当前移动的方向有柱子,那我们可以把这个方向上的柱子全部提取出来。(这里可以用之前记录的map为有柱子的所有方向都创建一个序列)不难发现,如果是向 x/yx/yx/y 增加的方向移动,那么最远移动距离就是 x/yx/yx/y 的后继 −1-1−1。若反方向移动,则最远移动距离就是 x/yx/yx/y 的前驱 +1+1+1。
(名词解释)设指定数为 aaa,则:
·后继:一个序列中大于 aaa 的最小值。
·前驱:一个序列中小于 aaa 的最大值。
若将要移动的位置比最远移动距离要远,那么机器人只能停在最远移动距离处。否则正常移动。
而求序列中指定数前驱或后继可以用平衡树,但是在不涉及排名的情况下,使用stl容器set更为简便。