题目本来没那么难的,其实就是每个格子走过了,就不能再计数了(res不加1),但是每个格子可以反复走,只不过!!!方向不能与之前某次走过这个格子的方向一样,这样就重复了。每当当前的格子往下一步(沿着当前方向)走,可以找到新的、合法的下一步时,就挪到下一步的格子里,res+1,并带着方向,位置,记录到que和路径记录中,clean也要记录新的位置。否则 ,改变方向,此时,位置还没改变,只能找当前位置与新的方向组成的三元组是否在之前路径中出现过,没有,则可以记录到que和路径记录中,是,则说明重复了,这样就意味着可以返回求结果了。
class Solution:
def numberOfCleanRooms(self, room: List[List[int]]) -> int:
dit = [(0,1),(1,0),(0,-1),(-1,0)]
row = len(room)
col = len(room[0])
que = collections.deque()
gosequen = set()
clean = set()
que.append((0,0,0))
gosequen.add((0,0,0))
clean.add((0,0))
while que:
curx,cury,dit_index = que.popleft()
dx,dy = dit[dit_index]
newx = curx + dx
newy = cury + dy
if (0 <= newx < row and 0 <= newy < col and room[newx][newy] == 0):
que.append((newx, newy, dit_index))
gosequen.add((newx, newy, dit_index))
clean.add((newx, newy))
else:
dit_index += 1
dit_index %= 4
if (curx,cury,dit_index) not in gosequen:
gosequen.add((curx,cury,dit_index))
que.append((curx,cury,dit_index))
return len(clean)