1. 程式人生 > 其它 >BFS-leetcode 773.滑動謎題

BFS-leetcode 773.滑動謎題

技術標籤:leetcodePython

題目:

在一個 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