本来以为很复杂……其实挺简单的,使用bfs,同时注意判重就可以。我多开一个字典,结果就MLE了。。。
主要的思路就是从最开始的12345678x得到所有的符合要求情况,然后判断即可。
from collections import deque
from itertools import permutations
perms = (''.join(perm) for perm in permutations('012345678'))
judge = {perm: None for perm in perms}
dir = [(-1, 0), (1, 0), (0, -1), (0, 1)]
op = ['d', 'u', 'r', 'l']
queue = deque()
queue.append([2, 2, '', '123456780'])
judge['123456780'] = True
while queue:
x, y, now, status = queue.popleft()
for k in range(4):
nx = x+dir[k][0]
ny = y+dir[k][1]
if 0 <= nx < 3 and 0 <= ny < 3:
a, b = 3*x + y, 3*nx + ny
p, q = status[a], status[b]
if a < b:
new_status = status[:a] + q + status[a+1:b] + p + status[b+1:]
else:
new_status = status[:b] + p + status[b+1:a] + q + status[a+1:]
if judge[new_status] is not None:
continue
judge[new_status] = op[k]+now
queue.append([nx, ny, op[k]+now, new_status])
check = ''.join(input().split()).replace('x', '0')
if judge[check] is not None:
print(judge[check])
else:
print('unsolvable')