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

2 篇文章 0 订阅
1 篇文章 0 订阅

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TerryBlog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值