用方向序列:右、下、左、上(顺时针)。
使用状态 (r, c, dir)
来判定是否进入循环。若某状态重复出现,则之后的路径将周期性重复,覆盖的去重格子数不再增加,可以停止。
维护:
visitedCell[r][c]
:该格子是否曾被巡逻过(用于统计去重数量)。seen[r][c][dir]
:该位置且该朝向是否出现过(用于判环)。每轮:
一块地用一个从 0 开始索引的二维二进制矩阵 block 表示,其中 0 表示空闲地块,1 表示放有障碍物的地块。在每个测试用例中,地的左上角永远是空闲的。一架无人机面向右侧,从左上角开始巡逻。无人机将一直前进,直到抵达的边界或遇到障碍物地块时,无人机将会顺时针旋转 90 度并重复以上步骤,初始位置和无人机飞过的地块都会被它巡逻。
若无人机可以持续飞行下去,输出被巡逻到的地块数量。
输入代表地块的二维数组,其中 0 代表空闲,1 代表有障碍物,例如 block=[[0,0,0],[1,1,0],[0,0,0]]。
输出无人机巡逻能覆盖的地块个数,例如 7
3 3
0 0 0
1 1 0
0 0 0
7
m==block.length
n==block[r].length
l≤m,n≤300
block[r][c] 只会是 0 或 1。
block[0][0] 为 0。