AcWing 845. 八数码-python(超时)
原题链接
中等
作者:
Actor丶
,
2020-02-15 22:01:20
,
所有人可见
,
阅读 758
"""
基本思想:
bfs模板:
1. 初始化队列
2. while queue不为空
3. 队顶元素出队
4. 遍历,满足条件的入队
"""
def bfs(start : list):
d = {}
d["".join(start)] = 0 # 用字符串存储状态,同时用字典存储状态与初始状态start之间的距离
end = "12345678x"
# 1. 初始化队列
queue = [start.copy()] # !!!注意:这里一定要对数组进行拷贝,否则后续对t修改后添加到queue中时,t的修改也会同步到queue数组中,导致queue始终都只有[start]一个元素
dx = [-1,0,1,0]
dy = [0,-1,0,1]
# 2. while queue不为空
while queue:
# 3. 队顶元素出队
t = queue.pop(0)
keyStrBefore = "".join(t)
if keyStrBefore==end: return d[keyStrBefore]
distance = d[keyStrBefore]
k = t.index("x")
# !!!技巧:字符"x"的一维索引向二维数组的索引转换
x = k//3
y = k%3
# 4. 遍历,满足条件的入队
for i in range(4):
a = x+dx[i]
b = y+dy[i]
if a>=0 and a<3 and b>=0 and b<3:
t[k], t[a*3+b] = t[a*3+b], t[k] # !!!技巧:二维索引[a,b]向一维数组的索引转变
keyStrAfter = "".join(t)
if keyStrAfter not in d:
queue.append(t.copy()) # !!!注意:这里也要对t进行拷贝,
d[keyStrAfter] = distance + 1
t[k], t[a*3+b] = t[a*3+b], t[k]
# 1. 输入示例
start = ["0" for i in range(9)] # 初始化起始状态,用列表来存储
in_li = input().split()
for i in range(9):
start[i] = in_li[i]
res = bfs(start)
if not res:
print(-1)
else:
print(res)
# 6 4 7 8 5 x 3 2 1
用deque代替pop(0),就可以AC了。
好的,我试试。谢谢
哈哈我也是超时啊!还是不能这么暴力啊hh~
这个图床放的行
什么意思?欢迎指正!
…原是要评论上一个分享的 页面刷新,评论到大佬这条了,溜了溜了