Leetcode 回溯法 深搜 單詞搜尋(79)

2022-03-01 03:44:51 字數 1651 閱讀 7388

給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。

單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。

示例:

board =

[ ['a','b','c','e'],

['s','f','c','s'],

['a','d','e','e']

]給定 word = "abcced", 返回 true

給定 word = "see", 返回 true

給定 word = "abcb", 返回 false

# encoding: utf-8

# 典型的深搜題目

# time: o(m·n), space: o(m·n)

class solution:

def exist(self, board, word):

def dfs(x, y, s_index):

if s_index == len(word): # 匹配完成了

return true

for i in range(4):

tx = x + next[i][0]

ty = y + next[i][1]

if 0 <= tx < rows and 0 <= ty < columns and board[tx][ty] == word[s_index]:

temp = board[tx][ty]

board[tx][ty] = '/'

if dfs(tx, ty, s_index + 1):

return true

board[tx][ty] = temp

return false

if not board:

return false

next = [ # 右下左上

[0, 1],

[1, 0],

[0, -1],

[-1, 0]

]columns, rows = len(board[0]), len(board)

# book = [[0 for _ in range(columns)] for _ in range(rows)] # 標記

s_index = 0

for i in range(rows):

for j in range(columns):

if board[i][j] == word[s_index]:

temp = board[i][j] # 不用book標記了,存入臨時變數並修改board[i][j]為特殊字元,和原來自己的book標記思路相比,節省了o(mn)的空間

board[i][j] = '/'

if dfs(i, j, s_index + 1):

return true

board[i][j] = temp

return false

s = solution()

ans = s.exist([["a", "b", "c", "e"],

["s", "f", "c", "s"],

["a", "d", "e", "e"]], 'bfce')

print(ans) # true

hnust 水果消除 回溯法 深搜

水果消除 是一款手機遊戲,相信大家都玩過或玩過類似的遊戲。下面是 水果消除 遊戲的一種初始狀態。消除的基本規則 如果有2個或2個以上的相同水果連在一起,則可以點選並消除。請問在某一種狀態下,有幾種可以點選並消除的選擇方案。例如,對於上圖所示的初始狀態,將有6種點選並消除的選擇方案。這6種方案依次如下...

dfs深搜演算法及回溯法以及回溯法的型別題

dfs是對乙個連通圖進行遍歷的演算法。它的思想是從乙個頂點v0開始,沿著一條路一直走到底,如果發現不能到達目標解,那就返回到上乙個節點,然後從另一條路開始走到底,這種盡量往深處走的概念即是深度優先的概念。回溯法 問題的每個解都包含n部分,先給出第一部分,再給出第二部分,直到給出第n部分,這樣就得到了...

oj 深搜 回溯(3)

求幾個數的全排列 include include using namespace std intmap 100 假設排列數的個數最多為100 int n 實際個數 int q 多少種不同的數 int icount 100 存放每種不同的數的個數。陣列大小由q決定 int itable 100 存放一...