蓝桥杯:跳蚱蜢————Python

题目
如图 p1.png 所示: 有9只盘子,排成1个圆圈。

其中8只盘子内装着8只蚱蜢,有一个是空盘。

我们把这些蚱蜢顺时针编号为 1~8。

每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中。

请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,并且保持空盘的位置不变(也就是1-8换位,2-7换位,…),至少要经过多少次跳跃?

注意:要求提交的是一个整数,请不要填写任何多余内容或说明文字。


Code

from collections import deque


def bfs(arr):
    n, vis, queue = len(arr), dict(), deque()
    queue.append((arr, 0))
    while queue:
        front = queue.popleft()
        tmp, cnt = front
        # print(tmp, cnt)

        if tmp == "876543210":
            print(cnt)
            return

        if vis.get(tmp, None):
            continue
        vis[tmp] = True

        idx, tmp = tmp.index("0"), list(tmp)
        for i in [-2, -1, 1, 2]:
            tmp[idx], tmp[(idx + i) % n] = tmp[(idx + i) % n], tmp[idx]
            val = ''.join(tmp)
            if not vis.get(val, None):
                queue.append((val, cnt + 1))
            tmp[idx], tmp[(idx + i) % n] = tmp[(idx + i) % n], tmp[idx]


if __name__ == '__main__':
    """
    [1, 2, 3, 4, 5, 6, 7, 8, 0] -> [8, 7, 6, 4, 4, 3, 2, 1, 0]
    """
    sequence = "123456780"
    bfs(sequence)

Answer

  • 20

猜你喜欢

转载自blog.csdn.net/Kinght_123/article/details/113975227