1、考察要点
- BFS:需要掌握普通BFS解题模板,以及需要确定当前遍历到了哪一层的BFS模板。
- deque:需要掌握Python双向队列collections.deque的基本操作。
- 二叉树:使用BFS解决二叉树问题的层序遍历问题。
- 网格问题:在此题中,华容道就是典型网格问题,可以视为树,通过BFS来搜索,解决最短路径问题。其中,3 × \times × 3 的网格的中心点可以作为根节点,第一层有四个分叉(四叉树),然后这棵树一共有四个叶子节点。
2、个人思路
用字符串保存华容道的状态。需要注意的是拼接字符串以及两个对角是不能直接移动的。此外,需要注意同一层中不能有一样的字符串节点出现,用in来判断是否在队列中,否则会因为冗余(搜索的时间复杂度过高)超时。
3、代码
from collections import deque
chessboard = input() + input() # 用字符串存储状态,[0,1,2,3,4,5]
step = 0
q = deque()
q.append(chessboard)
index_A = chessboard.index('A')
index_B = chessboard.index('B')
operation = [-3,-1,1,3]
##print(q)
# 开始BFS的层次遍历
while q:# 判断是否为空
level_size = len(q)
for num in range(level_size): # bfs判断当前层有多少个元素,由于队列是先进先出,所以一定会先取出size个元素
root = q.popleft()
index_empty = root.index(' ') # 以空格为根节点,进行三叉/二叉子树遍历
if root.index('A') == index_B and root.index('B') == index_A:
print(step)
break
for idx in operation:
if 0<= index_empty+idx <=5 and not(index_empty==2 and index_empty+idx==3) and not(index_empty==3 and index_empty+idx==2):
if index_empty+idx > index_empty:
node = root[0:index_empty] + root[index_empty+idx] + root[index_empty+1:index_empty+idx] + root[index_empty]+ root[index_empty+idx+1:]
else:
node = root[0:index_empty+idx] + root[index_empty] + root[index_empty+idx+1:index_empty] + root[index_empty+idx] + root[index_empty+1:]
if node not in q: # 同一层中不应该出现相同的元素
q.append(node)
else:
step+=1
## print(q)
continue
break