題目描述
在二維網格 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)
解題思路
這道題與上一題不同之處在於,這道題起始點和終止點的位置不確定,而且這道題明確要求所有空位點必須經過一次,且最終點落腳到終止點。
題目判斷是否所有點均走過可以使用乙個變數來記錄,事先儲存好所有可以走的點的總數(包括起始點,終止點可空位點),然後使用回溯方法,當到達終點時,判斷走過的點總是是否等於預先儲存的那個數,如果是,則滿足條件
class solution(object):這裡首先先儲存起始點和終止點的下標,並且記錄所有可以走的點的總數(這裡0,1, 2均可),沒每走過乙個點,就將該點置為-1,方便後續操作,同一層dfs執行完後需要將這個點再變回來(這點很重要,對應於grid[nx][ny] = temp這是回溯的基本框架)。def uniquepathsiii(self, grid):
""":type grid: list[list[int]]
:rtype: int
"""cnt = 0 #無障礙方格總數
start_x = start_y = 0
self.end_x = self.end_y = 0
m, n = len(grid), len(grid[0])
for i in range(m):
for j in range(n):
if grid[i][j] == 1:
start_x = i
start_y = j
cnt += 1
elif grid[i][j] == 2:
self.end_x = i
self.end_y = j
cnt += 1
elif grid[i][j] == 0:
cnt += 1
self.res = 0
grid[start_x][start_y] = -1
self.dfs(grid, m, n, start_x, start_y, cnt, 0)
return self.res
def dfs(self, grid, m, n, x, y, cnt, step):
if x == self.end_x and y == self.end_y:
if step == cnt - 1:
self.res += 1
return
for nx, ny in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:
if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] != -1:
temp = grid[nx][ny]
grid[nx][ny] = -1
self.dfs(grid, m, n, nx, ny, cnt, step + 1)
grid[nx][ny] = temp
s = solution()
print(s.uniquepathsiii([[1,0,0,0],[0,0,0,0],[0,0,2,-1]]))
leetcode No 980 不同路徑 III
承接 不同路徑 i 和 不同路徑 ii,雖然我的解法沒用到動態規劃,但是還是忍不住一塊說了吧。力扣 leetcode cn.com 題目描述 在二維網格grid上,有 4 種型別的方格 返回在四個方向 上 下 左 右 上行走時,從起始方格到結束方格的不同路徑的數目,每乙個無障礙方格都要通過一次。示例...
力扣 65不同路徑
最近在刷力扣上的題目,刷到了65不同路徑,當初上大學的時候,曾在hihocoder上刷到過這道題目,但是現在已經幾乎全忘光了,大概的知識點是動態規劃,如今就讓我們一起來回顧一下。題目原文是 乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動...
力扣62 不同路徑
乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?示例 1 輸入 m 3,n 7 輸出 28 示例 2 輸入 m 3,n 2 輸出 3 解釋 從左上角...