题目描述:
自己的提交:
class Solution: def minPushBox(self, grid: List[List[str]]) -> int: driction = [(0,1),(0,-1),(-1,0),(1,0)] for i in range(len(grid)): for j in range(len(grid[0])): if grid[i][j] == "B": box = (i,j) if grid[i][j] == "S": grid[i][j] = "." start = (i,j) if grid[i][j] == "T": grid[i][j] = "." target = (i,j) def dfs(start,end,visited): visited.add(start) if start == end: return True for i_,j_ in driction: i,j = start[0] + i_,start[1] + j_ if 0<=i<len(grid) and 0<=j<len(grid[0]) and (grid[i][j] == "." /
or grid[i][j] == "B") and (i,j) not in visited and dfs((i,j),end,visited): return True return False visited = set() queue = [] queue.append((box[0],box[1],start[0],start[1])) visited.add((box[0],box[1],start[0],start[1])) res = -1 while queue: tmp = [] res += 1 for i,j,x,y in queue: if target == (i,j): return res if 0 <= j-1 < j+1 < len(grid[0]) and grid[i][j-1] != "#" and grid[i][j+1] != "#": if (i,j-1,i,j) not in visited and dfs((x,y),(i,j+1),{(i,j)}): visited.add((i,j-1,i,j)) tmp.append((i,j-1,i,j)) if (i,j+1,i,j) not in visited and dfs((x,y),(i,j-1),{(i,j)}): visited.add((i,j+1,i,j)) tmp.append((i,j+1,i,j)) if 0 <= i-1 < i+1 < len(grid) and grid[i-1][j] != "#" and grid[i+1][j] != "#": if (i-1,j,i,j) not in visited and dfs((x,y),(i+1,j),{(i,j)}): visited.add((i-1,j,i,j)) tmp.append((i-1,j,i,j)) if (i+1,j,i,j) not in visited and dfs((x,y),(i-1,j),{(i,j)}): visited.add((i+1,j,i,j)) tmp.append((i+1,j,i,j)) queue = tmp return -1
优化:*
class Solution: def minPushBox(self, grid: List[List[str]]) -> int: n, m = len(grid), len(grid[0]) for i in range(n): for j in range(m): if grid[i][j] == 'T': t = (i, j) elif grid[i][j] == 'S': s = (i, j) elif grid[i][j] == 'B': b = (i, j) dirs = [[1, 0], [-1, 0], [0, 1], [0, -1]] q = [tuple(s + b)] seen = set(q) steps = 0 while q: nq = [] for si, sj, bi, bj in q: if t == (bi, bj): return steps for di, dj in dirs: nsi, nsj = si + di, sj + dj if nsi == bi and nsj == bj: nbi, nbj = bi + di, bj + dj ds = 1 else: nbi, nbj = bi, bj ds = 0 if not (0 <= nsi < n and 0 <= nsj < m): continue if not (0 <= nbi < n and 0 <= nbj < m): continue if grid[nsi][nsj] == '#' or grid[nbi][nbj] == '#': continue nsb = (nsi, nsj, nbi, nbj) if nsb in seen: continue seen.add(nsb) if ds == 0: q.append(nsb) else: nq.append(nsb) q = nq steps += 1 return -1