AcWing BFS相关问题 1107. 魔板

本文深入探讨了BFS算法的状态拓展应用,通过一个具体的示例,详细解释了如何使用广度优先搜索解决特定问题。文章包括了算法的实现代码,展示了如何通过状态拓展来寻找目标状态,并记录路径。
import sys
sys.stdin = open('data.txt', 'r')

'''
BFS 状态拓展应用
'''

from collections import deque

target = list( map(int, input().split()) )

def hash(arr):
    ans = 0
    base = 1
    for i in range(8):
        ans += arr[i] * base
        base *= 10
    return ans

def bfs(init_arr, target):
    que = deque()
    que.append(tuple(init_arr))
    prev = { hash(init_arr): (None, None) }

    step = 0
    flag = False
    while len(que) > 0:
        node_num = len(que)

        for _ in range(node_num):
            cur = list(que.popleft())
            if tuple(cur) == tuple(target):
                flag = True
                break

            A_stat = (cur[7], cur[6], cur[5], cur[4], cur[3], cur[2], cur[1], cur[0])
            B_stat = (cur[3], cur[0], cur[1], cur[2], cur[5], cur[6], cur[7], cur[4])
            C_stat = (cur[0], cur[6], cur[1], cur[3], cur[4], cur[2], cur[5], cur[7])

            if hash(A_stat) not in prev:
                prev[hash(A_stat)] = ('A', cur)
                que.append(A_stat)
            if hash(B_stat) not in prev:
                prev[hash(B_stat)] = ('B', cur)
                que.append(B_stat)
            if hash(C_stat) not in prev:
                prev[hash(C_stat)] = ('C', cur)
                que.append(C_stat)

        if flag:
            break
        step += 1

    path = []
    cur = tuple(target)
    while cur:
        key = hash(cur)
        if prev[key][0] is not None:
            path.append(prev[hash(cur)][0])
        cur = prev[hash(cur)][1]

    return step, path[::-1]

path_len, path = bfs([1,2,3,4,5,6,7,8], target)
print(path_len)
if len(path) > 0:
    print(''.join(path))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值