卡片换位(Python实现)的个人思路

1、考察要点

  1. BFS:需要掌握普通BFS解题模板,以及需要确定当前遍历到了哪一层的BFS模板。
  2. deque:需要掌握Python双向队列collections.deque的基本操作。
  3. 二叉树:使用BFS解决二叉树问题的层序遍历问题。
  4. 网格问题:在此题中,华容道就是典型网格问题,可以视为树,通过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

你可能感兴趣的:(#,刷题,Python,#,BFS,python,蓝桥别,BFS)