题目:
在一个 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+=str(board[i][j])
# BFS
visited=[start]
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