leetcode-163周赛-1263-推箱子*

题目描述:

 

 

自己的提交:

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

猜你喜欢

转载自www.cnblogs.com/oldby/p/11901323.html