力扣 980不同路徑III回溯解法

2021-10-08 05:46:33 字數 2424 閱讀 2097

題目描述

在二維網格 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):

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]]))

這裡首先先儲存起始點和終止點的下標,並且記錄所有可以走的點的總數(這裡0,1, 2均可),沒每走過乙個點,就將該點置為-1,方便後續操作,同一層dfs執行完後需要將這個點再變回來(這點很重要,對應於grid[nx][ny] = temp這是回溯的基本框架)。

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 解釋 從左上角...