设有大小不等的三个圆盘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次