給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。
單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中「相鄰」單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。
示例:
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 存放一...