亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

python實現三階魔方還原的示例代碼

瀏覽:2日期:2022-06-20 18:02:24
思路

復原魔方困難問題的分解:

​ 1、用合適的數據結構表示出三階魔方的六個面以及每一面的顏色

​ 2、每一次不同旋轉操作的實現

​ 3、復原時如何判斷當前魔方應該使用哪一種公式

本次實驗實現了前兩個操作,具體思路是:

用numpy庫中的矩陣將六個面分別表示出來,按上下左右前后的順序放入列表中。再依據流行公式里的方法編寫對每一個面進行旋轉操作的函數,調用函數實現魔方的旋轉。最后輸入指令可得到旋轉之后的魔方,以及執行逆序指令后驗證魔方還原。

預備知識

矩陣:使用numpy庫中的矩陣結構

函數說明:

U: 上面順時針旋轉 90°

D: 底面順時針旋轉 90°

L: 左面順時針旋轉 90°

R: 右面順時針旋轉 90°

F: 正面順時針旋轉 90°

B: 背面順時針旋轉 90°

**注:**字母前加上下劃線 ‘_’ 表示逆時針

代碼詳解

本次實驗將【上、下、左、右、前、后】六個面用數字【0、1、2、3、4、5】表示原本每個面的顏色,并依次存入列表faces【】里(即:faces[0]中存放的是最上面的數字全為0的三階矩陣)

注:魔方視角始終固定,即在整個過程中正(左…)面始終是正(左…)面

# 創建六個面,放在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])

python實現三階魔方還原的示例代碼

每一個面的 順時針 和 逆時針 旋轉由函數 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°。這時,我們只需按順序交換每一面的第一行,最后再逆時針或順時針轉回來即可。

python實現三階魔方還原的示例代碼

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 npimport 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 facedef 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 55 2 3 1 2 1 2 4 0 4 0 01 2 3 1 4 5 1 3 1 4 5 22 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 02 2 2 4 4 4 3 3 3 5 5 52 2 2 4 4 4 3 3 3 5 5 52 2 2 4 4 4 3 3 3 5 5 5 1 1 1 1 1 1 1 1 1Process finished with exit code 0

注:大寫為順時針,小寫為逆時針

到此這篇關于python實現三階魔方還原的示例代碼的文章就介紹到這了,更多相關python 三階魔方還原內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产精品短视频免费观看 | 网站久久| 国内自拍第100页 | 亚洲精品丝袜在线一区波多野结衣 | 国产a级三级三级三级中国 国产a级午夜毛片 | 一级毛片免费 | 国产夜趣福利免费视频 | 久久精品国产欧美 | 特黄特色大片免费高清视频 | 男生j桶进女人p又色又爽又黄 | 手机在线观看视频你懂的 | 综合激情婷婷 | 97视频免费观看2区 97午夜 | 日本一级特黄aa大片在线观看 | 欧美日韩在线观看视频 | 日韩免费高清一级毛片久久 | 国产免费一区二区三区最新 | 国内国外精品一区二区 | 国产精品亚洲专一区二区三区 | 久久1024| 国产美女亚洲精品久久久毛片 | 综合久久综合 | 日韩欧美视频免费观看 | 美国一级大黄大色毛片视频一 | 国产免费人做爰午夜视频 | 午夜激情视频在线观看 | 小明成人永久在线看 | 亚洲黄v | 成年人午夜 | 免费人成视网站在线不卡 | 成人做爰| 高清中文字幕在线 | 高h猛烈做哭bl壮汉受小说 | 九九在线免费观看视频 | 国产在线观看成人免费视频 | 成人涩 | 亚洲精品中文字幕乱码一区二区 | 久996视频精品免费观看 | 天天套图 | 亚洲一区二区黄色 | 亚洲视频一区在线观看 |