题目:不同路径III
在二维网格 grid
上,有 4 种类型的方格:
1
表示起始方格。且只有一个起始方格。2
表示结束方格,且只有一个结束方格。0
表示我们可以走过的空方格。-1
表示我们无法跨越的障碍。
返回在四个方向(上、下、左、右)上行走时,从起始方格到结束方格的不同路径的数目,每一个无障碍方格都要通过一次。
示例 1:
输入:[[1,0,0,0],[0,0,0,0],[0,0,2,-1]] 输出:2 解释:我们有以下两条路径: 1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2) 2. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2)
示例 2:
输入:[[1,0,0,0],[0,0,0,0],[0,0,0,2]] 输出:4 解释:我们有以下四条路径: 1. (0,0),(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(1,0),(2,0),(2,1),(2,2),(2,3) 2. (0,0),(0,1),(1,1),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,3),(1,3),(2,3) 3. (0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(1,1),(0,1),(0,2),(0,3),(1,3),(2,3) 4. (0,0),(1,0),(2,0),(2,1),(1,1),(0,1),(0,2),(0,3),(1,3),(1,2),(2,2),(2,3)
示例 3:
输入:[[0,1],[2,0]] 输出:0 解释: 没有一条路能完全穿过每一个空的方格一次。 请注意,起始和结束方格可以位于网格中的任意位置。
提示:
1、1 <= grid.length * grid[0].length <= 20
题目链接:https://leetcode-cn.com/problems/unique-paths-iii/
代码:
class Solution:
def uniquePathsIII(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
R, C = len(grid), len(grid[0]) #因为每行都是同样长度,所以只取第一个的长度就可以了
def neighbors(r, c):
for nr, nc in ((r-1, c), (r, c-1), (r+1, c), (r, c+1)): #分别移到当前的上下左右
if 0 <= nr < R and 0 <= nc < C and grid[nr][nc] % 2 == 0:
yield nr, nc #如果为零则返回坐标
todo = 0
#eumerate函数是将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出
#数据和数据下标
for r, row in enumerate(grid): #r是索引,row是每行元素
for c, val in enumerate(row):
if val != -1: todo += 1 #记录可以走的点一共有多少
if val == 1: sr, sc = r, c #记录开始坐标
if val == 2: tr, tc = r, c #记录结束坐标
self.ans = 0
def dfs(r, c, todo):
todo -= 1
if todo < 0: return
if r == tr and c == tc: #如果到终点了
if todo == 0: #如果该走的步骤已经走完
self.ans += 1 #路线加一
return
grid[r][c] = -1 #本次路线走过得不能再走
for nr, nc in neighbors(r, c):
dfs(nr, nc, todo) #递归
grid[r][c] = 0 #将本次路线走过的还原
dfs(sr, sc, todo)
return self.ans