优先搜索圆盘问题--暴力搜索

设有大小不等的三个圆盘A,B,C套在一根轴上,每个盘子上都标有数字1,2,3,4,并且每个圆盘都可以独立绕轴做逆时针转动,每次转动90度,其初始状态S0和目标状态S如图所示,请求出S0到S的路径。

将三个圆盘用三个字符串表示,即:

start = ['2143', '2143', '2143']  # 表示初始圆盘S0
end = ['1432', '2143', '4321']  # 表示目标圆盘S

递归函数:递归每一层圆盘,直到遍历完所有圆盘:

"""
    递归函数
    i:表示第几个转盘
    """

    def recurrence(self, i):
        # 递归终止条件:当遍历完所有圆盘递归终止
        if i >= len(self.start):
            return
        
        # 判断是否达到每层的目标字串
        if self.start[i] == self.end[i]:
            i += 1
            return self.recurrence(i)

        # 将str转为list
        list_str = list(self.start[i])

        # 转90度
        for y in range(len(list_str)):
            list_str.append(list_str[0])
            del list_str[0]

            self.count += 1

            # 判断是否与目标字符串相同
            if ''.join(list_str) == self.end[i]:
                break

        i += 1
        return self.recurrence(i)

将该算法封装起来,定义该类的属性:

    def __init__(self, start, end):
        self.count = 0  # 记录转的总次数
        self.start = start  # 原转盘的数
        self.end = end  # 最终转盘上的数

所有代码如下:

"""
优先搜索圆盘问题
"""


class Circular:
    def __init__(self, start, end):
        self.count = 0  # 记录转的总次数
        self.start = start  # 原转盘的数
        self.end = end  # 最终转盘上的数

    """
    递归函数
    i:表示第几个转盘
    """

    def recurrence(self, i):
        # 递归终止条件
        if i >= len(self.start):
            return

        if self.start[i] == self.end[i]:
            i += 1
            return self.recurrence(i)

        # 将str转为list
        list_str = list(self.start[i])

        # 转90度
        for y in range(len(list_str)):
            list_str.append(list_str[0])
            del list_str[0]

            self.count += 1

            # 判断是否与目标字符串相同
            if ''.join(list_str) == self.end[i]:
                break

        i += 1
        return self.recurrence(i)


if __name__ == '__main__':
    start = ['2143', '2143', '2143']
    end = ['1432', '2143', '4321']

    q = Circular(start, end)
    q.recurrence(0)
    print(f'共转{q.count}次')

运行结果如下:

共转3次

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

シ昵称被我Ψ掉了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值