AcWing 845. 八数码-python3
原题链接
中等
作者:
机械佬也想学编程
,
2020-07-08 00:33:07
,
所有人可见
,
阅读 1871
from collections import deque
def bfs(start):
end = "12345678x"
d = {start : 0} # 该字典存放每个状态距离初始状态的距离
q = deque() # 存放将要验证的状态
q.append(start)
dx = [0, 1, 0, -1] # 用于"x"上下左右移动
dy = [1, 0, -1, 0]
while q:
t = q.popleft()
distance = d[t]
if t == end:
return distance
k = t.index('x')
x = k // 3 # 字符串的索引转换成3x3矩阵后的坐标
y = k % 3
tl = list(t) # 由于字符串不是不可变量,因而把字符串变为数组,用于交换字符串中的字符位置
for i in range(4): # "x"上下左右移动
a = x + dx[i]
b = y + dy[i]
if a >=0 and a < 3 and b >=0 and b < 3: # 若坐标未超出矩阵范围
nk = a * 3 + b #3x3矩阵的坐标转换成字符串的索引
tl[nk], tl[k] = tl[k], tl[nk] # 交换字符串中的字符位置
t = "".join(tl)
if t not in d: # 如果t这个状态是新状态(之前未出现过)
q.append(t)
d[t] = distance + 1
tl[nk], tl[k] = tl[k], tl[nk] # 还原现场
return -1
start = input().replace(" ", "")
ans = bfs(start)
print(ans)
作者大大我想问下,可不可以用我下面的方式模拟栈,,还有我的程序输出答案有误能帮忙看一下么?感谢~~~
栈的用法没问题,但是这题用的是队列…你用栈等于做了dfs,搜不到最短路径了
受教了[抱拳.jpg]
我想问一下,不导入deque,用pop(0)代替popleft()可以吗
不可以,list的pop和append会超时
因为我对python了解很少,我能问问什么时候适用deque
python自己的pop(0)时间复杂度是O(n)的,deque的popleft是O(1)
好的,谢谢