BFS-leetcode 773.滑動謎題
阿新 • • 發佈:2021-02-11
題目:
在一個 2 x 3 的板上(board)有 5 塊磚瓦,用數字 1~5 來表示, 以及一塊空缺用 0 來表示.一次移動定義為選擇 0 與一個相鄰的數字(上下左右)進行交換.最終當板 board 的結果是 [[1,2,3],[4,5,0]] 謎板被解開。
給出一個謎板的初始狀態,返回最少可以通過多少次移動解開謎板,如果不能解開謎板,則返回 -1 。
思路:
1.轉換:將board轉換為一個字串列表
2.neighbor:當0位於不同位置時,其可交換的鄰居
3.進行BFS遍歷,直到字串與目標字串相同
解答:
class Solution:
def slidingPuzzle(self, board: List[List[int]]) -> int:
neighbor=[[1,3],[0,2,4],[1,5],[0,4],[1,3,5],[2,4]]
m,n=2,3
start=""
target="123450"
step=0
# 將2x3的陣列轉換成字串
for i in range(m):
for j in range(n):
start+= chr(board[i][j]+ord('0'))
# BFS
visited=[]
queue=collections.deque([start])
while queue:
ql=len(queue)
for _ in range(ql):
cur=queue.popleft()
# 判斷是否達到目標局面
if cur==target:
return step
i=0
#尋找0在字串中所處的位置
while cur[i]!='0':
i+=1
#將0與鄰居交換位置,得到新字串
for adj in neighbor[i]:
new_board=list(cur)
new_board[adj],new_board[i]=new_board[i],new_board[adj]
#重新拼接為字串
new_board = "".join(new_board)
if new_board not in visited:
queue.append(new_board)
visited.append(new_board)
step+=1
return -1