上文介绍了计算机自动还原顶部十字,情况比较复杂,一旦完成,后续的步骤就简单一些了。本文在上文的基础上,还原魔方顶部为蓝色面,在顶部蓝色十字的前提下,要求将顶部四个棱角还原为蓝色棱角,棱角的其余两面需要与所在面的中心色一致,如下图所示:
沿用上文的化简方法,还原顶部蓝面比还原顶部蓝色十字简单多了,只需要考虑R面的左上和左下角,采用《软件工程》中介绍的判定表分析方法,分析如下:
状态 | 编码 | 动作 |
左下角有蓝色,其余两色与R和F面中心色一致 | 01 | R'D'RD(重复做) |
左下角有蓝色,其余两色与R和F面中心色不一致 | 02 | D‘ right |
左上角有蓝色,三色与U、R和F面中心色一致 | 10 | right |
左上角有蓝色,三色与U、R和F面中心色相同,但顺序不一致 | 11 | R'D'RD(重复做) |
左上角有蓝色,其余亮色与R和F面颜色不一致 | 12 | R'D'R right |
左上和左下角都没有蓝色 | right |
将判定表用Python字典实现如下:
conner_action_dict={'01':['Rp', 'Dp','R','D'],
'02':['Dp', 'right'],
'10':['right'],
'11':['Rp', 'Dp','R','D'],
'12':['Rp', 'Dp','R','right']
}
算法如下:
def 还原upper面():
while not 蓝色upper面():
coners_list=计算棱角颜色列表() #计算左上、下角编码
if len(coners_list)==0: #左、上下角无蓝色
right()
continue
conner =coners_list[0] #左上和左下都有蓝色,只取1个(左下优先)
command_list = conner_action_dict[conner] #查字典获得动作列表
if conner[1]=='1':
while not 左上角到位(): #重复执行公式,直到左上角三色到位
for command in command_list:
eval(command)()
else:
for command in command_list:
eval(command)()
运行结果:
1)打乱魔方
2)还原顶部蓝色十字
3)还原顶部蓝面
离我们的目标,还原整个魔方不远了!