不同路径III
看了某同学今天的华为机试题,发现其第三题就跟这题一样,于是拿出来做一做。
典型的回溯算法练习题,代码如下:
class Solution:
def __init__(self):
self.out = 0
def uniquePathsIII(self, grid: List[List[int]]) -> int:
dircetions = [(1, 0), (-1, 0), (0, 1), (0, -1)]
m, n = len(grid), len(grid[0])
res = 0
for i in range(m):
for j in range(n):
if grid[i][j] == 0:
res += 1
if grid[i][j] == 1:
start = (i, j)
visited = {start}
self.backsearch(m, n, grid, visited, start[0], start[1], dircetions, res)
return self.out
def backsearch(self, m, n, grid, visited, i, j, dircetions, res):
visited.add((i, j))
if grid[i][j] == 2 and len(visited) == res + 2:
return True
for a, b in dircetions:
i_new, j_new = a + i, b + j
if 0 <= i_new < m and 0 <= j_new < n and (i_new, j_new) not in visited and grid[i_new][j_new] != -1:
if self.backsearch(m, n, grid, visited | {(i_new, j_new)}, i_new, j_new, dircetions, res):
self.out += 1
return False
别人的代码(可以打印路径):
class Solution:
def uniquePathsIII(self, grid: List[List[int]]) -> int:
m, n=len(grid),len(grid[0])
obstacle=set()
for i in range(m):
for j in range(n):
if grid[i][j]==1:
start=(i,j)
elif grid[i][j]==2:
end=(i,j)
elif grid[i][j]==-1:
obstacle.add((i,j))
total_step=n*m-len(obstacle)
visited=set([start])
res=[0]
direcs=[[-1,0],[1,0],[0,1],[0,-1]]
def dfs(pos,path):
if len(path)==total_step and pos==end:
print(path)
res[0]+=1
return
for dx, dy in direcs:
x, y=pos[0]+dx, pos[1]+dy
if 0<=x<m and 0<=y<n and (x,y) not in visited\
and (x,y) not in obstacle:
visited.add((x,y))
dfs((x,y), path+[(x,y)])
visited.remove((x,y))
dfs(start,[start])
return res[0]
直接在原数组上修改已访问的方格,将其设置为-1.
class Solution:
def uniquePathsIII(self, grid):
start, end, p = None, None, 1
row, col = len(grid), len(grid[0])
for i in range(row):
for j in range(col):
if grid[i][j] == 1:
start = i, j
elif grid[i][j] == 2:
end = i, j
elif grid[i][j] == 0:
p += 1
def dfs(x, y, p):
if not (0 <= x < row and 0 <= y < col and grid[x][y] >= 0):
return 0
if end == (x, y) and p == 0:
return 1
grid[x][y] = -1
res = dfs(x+1, y, p-1) + dfs(x, y+1, p-1) + dfs(x-1, y, p-1) + dfs(x, y-1, p-1)
grid[x][y] = 0
return res
return dfs(start[0], start[1], p)