您好,登录后才能下订单哦!
这期内容当中小编将会给大家带来有关使用python怎么还原三阶魔方,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮点型)。2.字符串,分别是str类型和unicode类型。3.布尔型,Python布尔类型也是用于逻辑运算,有两个值:True(真)和False(假)。4.列表,列表是Python中使用最频繁的数据类型,集合中可以放任何数据类型。5. 元组,元组用”()”标识,内部元素用逗号隔开。6. 字典,字典是一种键值对的集合。7. 集合,集合是一个无序的、不重复的数据组合。
# 创建六个面,放在faces列表里,顺序为上(0),下(1),左(2),右(3),前(4),后(5) faces = [np.zeros((3, 3))] for i in range(1, 6): faces.append(np.ones((3, 3)) + faces[i - 1])
每一个面的 顺时针 和 逆时针 旋转由函数 clockwise() 和 antiClockwise() 实现
t = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]]) # 该面顺时针旋转 90 度 def clockwise(face): face = face.transpose().dot(t) return face # 该面逆时针旋转 90 度 def antiClockwise(face): face = face.dot(t).transpose() return face
A.transpose() 方法是实现 A 矩阵的转置
A.dot(B) 方法是实现 A乘以矩阵B
通过计算,上述方法可以实现矩阵顺时针或者逆时针旋转的效果
在这里以左面的顺时针旋转 90°为例,其它旋转方式可以类比
def L(FACES): FACES[2] = clockwise(FACES[2]) FACES_new = cp.deepcopy(FACES) a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) e[0], f[0], g[0], h[0] = d[0], a[0], b[0], c[0] FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h)
1、直接调用函数将左面(第2面)顺时针旋转 90°
FACES[2] = clockwise(FACES[2])
2、这里采用深度复制,使用 cp.deepcopy() 的方法,避免直接使用等号 ‘=' 导致不同的变量指向同一个值。这时,【e、f、g、h】和【a、b、c、d】代表魔方的
【正面、底面顺时针旋转90°、背面逆时针旋转90°、上面顺时针旋转90°】
a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0])
旋转的目的是:
在左面旋转的过程中,左面会影响到其它四个面,但对其它四个面的影响是不同的。例如正面、底面和上面被影响的是第一列,而背面被影响的是第三列。我们为了使各面统一起来,方便数值的改变,我们选择将正、底、上面顺时针旋转90°,将背面逆时针旋转90°。这时,我们只需按顺序交换每一面的第一行,最后再逆时针或顺时针转回来即可。
3、按顺序交换:正面第一行传递到底面第一行
上面第一行传递到正面第一行
背面第一行传递到上面第一行
底面第一行传递到背面第一行
e[0], f[0], g[0], h[0] = d[0], a[0], b[0], c[0]
最后再依次根据上述操作逆旋转回去:
FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h)
代码
import numpy as np import copy as cp # 创建六个面,放在faces列表里,顺序为上(0),下(1),左(2),右(3),前(4),后(5) faces = [np.zeros((3, 3))] for i in range(1, 6): faces.append(np.ones((3, 3)) + faces[i - 1]) t = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]]) # 该面顺时针旋转 90 度 def clockwise(face): face = face.transpose().dot(t) return face # 该面逆时针旋转 90 度 def antiClockwise(face): face = face.dot(t).transpose() return face def U(FACES): FACES[0] = clockwise(FACES[0]) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3] FACES[4][0], FACES[2][0], FACES[5][0], FACES[3][0] = d[0], a[0], b[0], c[0] def _U(FACES): FACES[0] = antiClockwise(FACES[0]) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3] FACES[4][0], FACES[2][0], FACES[5][0], FACES[3][0] = b[0], c[0], d[0], a[0] def U2(FACES): for i in range(2): U(FACES) ''' FACES[0] = clockwise(clockwise(FACES[0])) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3] FACES[4][0], FACES[2][0], FACES[5][0], FACES[3][0] = c[0], d[0], a[0], b[0] ''' def D(FACES): FACES[1] = clockwise(FACES[1]) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3] FACES[4][2], FACES[2][2], FACES[5][2], FACES[3][2] = b[2], c[2], d[2], a[2] def _D(FACES): FACES[1] = antiClockwise(FACES[1]) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3] FACES[4][2], FACES[2][2], FACES[5][2], FACES[3][2] = d[2], a[2], b[2], c[2] def D2(FACES): for i in range(2): D(FACES) ''' FACES[1] = clockwise(clockwise(FACES[1])) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[4], FACES_new[2], FACES_new[5], FACES_new[3] FACES[4][2], FACES[2][2], FACES[5][2], FACES[3][2] = c[2], d[2], a[2], b[2] ''' def L(FACES): FACES[2] = clockwise(FACES[2]) FACES_new = cp.deepcopy(FACES) a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) e[0], f[0], g[0], h[0] = d[0], a[0], b[0], c[0] FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h) def _L(FACES): FACES[2] = antiClockwise(FACES[2]) FACES_new = cp.deepcopy(FACES) a, b, c, d = clockwise(FACES_new[4]), clockwise(FACES_new[1]), antiClockwise(FACES_new[5]), clockwise(FACES_new[0]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) e[0], f[0], g[0], h[0] = b[0], c[0], d[0], a[0] FACES[4], FACES[1], FACES[5], FACES[0] = antiClockwise(e), antiClockwise(f), clockwise(g), antiClockwise(h) def L2(FACES): for i in range(2): L(FACES) # 上(0),下(1),左(2),右(3),前(4),后(5) def R(FACES): FACES[3] = clockwise(FACES[3]) FACES_new = cp.deepcopy(FACES) a, b, c, d = antiClockwise(FACES_new[4]), antiClockwise(FACES_new[1]), clockwise(FACES_new[5]), antiClockwise( FACES_new[0]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) g[0], f[0], e[0], h[0] = d[0], c[0], b[0], a[0] FACES[4], FACES[1], FACES[5], FACES[0] = clockwise(e), clockwise(f), antiClockwise(g), clockwise(h) def _R(FACES): FACES[3] = antiClockwise(FACES[3]) FACES_new = cp.deepcopy(FACES) a, b, c, d = antiClockwise(FACES_new[4]), antiClockwise(FACES_new[1]), clockwise(FACES_new[5]), antiClockwise( FACES_new[0]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) f[0], g[0], h[0], e[0] = a[0], b[0], c[0], d[0] FACES[4], FACES[1], FACES[5], FACES[0] = clockwise(e), clockwise(f), antiClockwise(g), clockwise(h) def R2(FACES): for i in range(2): R(FACES) def F(FACES): FACES[4] = clockwise(FACES[4]) FACES_new = cp.deepcopy(FACES) a, b, c, d = clockwise(clockwise(FACES_new[0])), FACES_new[1], antiClockwise(FACES_new[2]), clockwise(FACES_new[3]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) e[0], g[0], f[0], h[0] = c[0], b[0], d[0], a[0] FACES[0], FACES[1], FACES[2], FACES[3] = clockwise(clockwise(e)), f, clockwise(g), antiClockwise(h) def _F(FACES): FACES[4] = antiClockwise(FACES[4]) FACES_new = cp.deepcopy(FACES) a, b, c, d = clockwise(clockwise(FACES_new[0])), FACES_new[1], antiClockwise(FACES_new[2]), clockwise(FACES_new[3]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) g[0], f[0], h[0], e[0] = a[0], c[0], b[0], d[0] FACES[0], FACES[1], FACES[2], FACES[3] = clockwise(clockwise(e)), f, clockwise(g), antiClockwise(h) def F2(FACES): for _ in range(2): F(FACES) # 上(0),下(1),左(2),右(3),前(4),后(5) def B(FACES): FACES[5] = clockwise(FACES[5]) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[0], clockwise(clockwise(FACES_new[1])), clockwise(FACES_new[2]), antiClockwise(FACES_new[3]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) g[0], f[0], h[0], e[0] = a[0], c[0], b[0], d[0] FACES[0], FACES[1], FACES[2], FACES[3] = e, clockwise(clockwise(f)), antiClockwise(g), clockwise(h) def _B(FACES): FACES[5] = antiClockwise(FACES[5]) FACES_new = cp.deepcopy(FACES) a, b, c, d = FACES_new[0], clockwise(clockwise(FACES_new[1])), clockwise(FACES_new[2]), antiClockwise(FACES_new[3]) e, f, g, h = cp.deepcopy(a), cp.deepcopy(b), cp.deepcopy(c), cp.deepcopy(d) e[0], g[0], f[0], h[0] = c[0], b[0], d[0], a[0] FACES[0], FACES[1], FACES[2], FACES[3] = e, clockwise(clockwise(f)), antiClockwise(g), clockwise(h) def B2(FACES): for i in range(2): B(FACES) ''' |************| |*U1**U2**U3*| |************| |*U4**U5**U6*| |************| |*U7**U8**U9*| |************| ************|************|************|************| *L1**L2**L3*|*F1**F2**F3*|*R1**R2**R3*|*B1**B2**B3*| ************|************|************|************| *L4**L5**L6*|*F4**F5**F6*|*R4**R5**R6*|*B4**B5**B6*| ************|************|************|************| *L7**L8**L9*|*F7**F8**F9*|*R7**R8**R9*|*B7**B8**B9*| ************|************|************|************| |************| |*D1**D2**D3*| |************| |*D4**D5**D6*| |************| |*D7**D8**D9*| |************| ''' def toString(FACES): print() for i in range(3): print(" ", int(FACES[0][i][0]), int(FACES[0][i][1]), int(FACES[0][i][2])) for i in range(3): print(int(FACES[2][i][0]), int(FACES[2][i][1]), int(FACES[2][i][2]), end=" ") print(int(FACES[4][i][0]), int(FACES[4][i][1]), int(FACES[4][i][2]), end=" ") print(int(FACES[3][i][0]), int(FACES[3][i][1]), int(FACES[3][i][2]), end=" ") print(int(FACES[5][i][0]), int(FACES[5][i][1]), int(FACES[5][i][2])) for i in range(3): print(" ", int(FACES[1][i][0]), int(FACES[1][i][1]), int(FACES[1][i][2])) print() def moves(FACES, lst): for x in lst: if x == 'U': U(faces) elif x == 'u': _U(faces) elif x == 'D': D(faces) elif x == 'd': _D(faces) elif x == 'L': L(faces) elif x == 'l': _L(faces) elif x == 'R': R(faces) elif x == 'r': _R(faces) elif x == 'F': F(faces) elif x == 'f': _F(faces) elif x == 'B': B(faces) elif x == 'b': _B(faces) lst = input("请输入步骤:") moves(faces, lst) print("执行后的魔方为") toString(faces) reverse = ''.join(map(chr, map(lambda x: ord(x) ^ 32, lst)))[::-1] moves(faces, reverse) print("魔方恢复步骤:", reverse) toString(faces)
示例
请输入步骤:UBLDFRULFDRULBGBVFDRLLBFLLDSSDBVDJFRUDLRFBDLFBbdj 执行后的魔方为 2 5 3 5 0 2 5 0 5 5 2 3 1 2 1 2 4 0 4 0 0 1 2 3 1 4 5 1 3 1 4 5 2 2 5 2 4 4 3 1 0 5 3 4 4 1 0 4 3 1 3 0 3 0 魔方恢复步骤: JDBbfldbfrldurfjdvbdssdllfbllrdfvbgblurdflurfdlbu 0 0 0 0 0 0 0 0 0 2 2 2 4 4 4 3 3 3 5 5 5 2 2 2 4 4 4 3 3 3 5 5 5 2 2 2 4 4 4 3 3 3 5 5 5 1 1 1 1 1 1 1 1 1 Process finished with exit code 0
上述就是小编为大家分享的使用python怎么还原三阶魔方了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。