classSolution:defallPathsSourceTarget(self, graph: List[List[int]])-> List[List[int]]:
res =[]
path =[0]# 每条路径都从第0个节点开始defdfs(x:int):# 若已经到达第n-1个节点,则找到一条路径if x ==len(graph)-1:
res.append(path[:])return# 对当前节点中的所有后续节点进行深度遍历for y in graph[x]:
path.append(y)
dfs(y)
path.pop()
dfs(0)return res
classSolution:# 记忆化搜索(更快)defcountRoutes(self, locations: List[int], start:int, finish:int, fuel:int)->int:
n =len(locations)
MOD =10**9+7# 预处理: 计算两两城市间的距离, 否则的话, 一对城市间的距离会重复计算多遍
d =[[0]* n for _ inrange(n)]for i inrange(n):for j inrange(i):
d[i][j]= d[j][i]=abs(locations[i]- locations[j])@lru_cache(None)defdfs(i, fuel):if i == finish:
ans =1else:
ans =0if fuel ==0:return ans
# 剪枝: 如果目前的位置已经无法达到终点了, 提早终止if d[i][finish]> fuel:return ans
for j inrange(n):if j == i:continue
dist = D[i][j]if fuel >= dist:
ans += dfs(j, fuel - dist)return ans % MOD
return dfs(start, fuel)
classSolution:# 动态规划defcountRoutes(self, locations: List[int], start:int, finish:int, fuel:int)->int:
n =len(locations)
mod =1e9+7# dp[i][j]表示到达第i个城市,消耗油量j的路径数量
dp =[[0for _ inrange(fuel +1)]for _ inrange(n)]
dp[start][0]=1# 到达start,花费燃料为0,方案数为1for f inrange(0, fuel +1):# 下面两个循环表示遍历每两个城市i、j(注意:这里的i、j不表示第i个城市、消耗油量j!)for i inrange(n):for j inrange(n):# 若为同一个城市(i=j),则跳过if i == j:continue
cost =abs(locations[i]- locations[j])if f + cost <= fuel:# 花费燃料从城市i走到城市j的转移方程, 可以想象成树,同一个节点有很多个子节点。
dp[j][f + cost]+= dp[i][f]
dp[j][f + cost]%= mod
res =0# 遍历所有到达了终点,并且燃料用完/没用完的路径for f inrange(fuel +1):
res += dp[finish][f]
res %= mod
returnint(res)
classSolution:defcrackSafe(self, n:int, k:int)->str:
visited =set()
ans =list()
highest =10**(n -1)defdfs(node):for x inrange(k):
nei = node *10+ x
if nei notin visited:
visited.add(nei)
dfs(nei % highest)
ans.append(str(x))
dfs(0)return"".join(ans)+"0"*(n -1)