知恵袋の正八面体の色の塗り分け問題をPythonで解いてみました。(^_^;
正八面体の各面に3色の絵の具で色を塗る時、何通りの塗り方があるか。
ただし、辺を共通する隣り合った面には同じ色を塗ることができず、また回転させて一致する時は同じ塗り方とする。
正八面体の各面に前回と同様にA〜Hと名前を付けました。また、色の名前をa〜hとしました。ただし、今回は3色しか使いませんが応用が利くようにこうしておきました。(^_^;
知恵袋の回答と結果が異なりますが、参考URLの結果とは一致しています。(^_^;
正八面体は、 0,1,12,103,730,2400,3360,1680
● OctahedronColoring2.py
# coding: UTF-8 # OctahedronColoring2.py import itertools from time import time DB = [] # 発見したパターンの記録用 # 回転させて一致する塗り方のパターンか調べる def isSamePat(p): A,B,C,D,E,F,G,H = p S = [] T = [(A,B,C,D,E,F,G,H),(F,E,H,G,C,D,A,B),(C,D,H,G,B,A,E,F)] for t in T: s = "%s%s|%s%s|%s%s|%s%s|"%t*2 S.append(s+s[::-1]) for d in DB: for s in S: if d in s: return True DB.append("%s%s|%s%s|%s%s|%s%s"%(A,B,C,D,E,F,G,H)) return False def main(): tm=time() # Timer Start P = 'abcdefgh' # 色 n = 3 # 色数 c = 0 DB = [] for p in itertools.product(P[:n],repeat=8): A,B,C,D,E,F,G,H = p # 同じ色が隣接したらスキップ if A==C or A==G or A==F: continue if E==B or E==C or E==G: continue if D==B or D==F or D==G: continue if H==B or H==C or H==F: continue if len(set(p))!=n: continue # 色の数をチェック if isSamePat(p): continue # 回転させて同じパターンならスキップ # チェックを潜り抜けたものだけをカウント c+=1 print(c) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
12 Runtime : 0.005 [sec]
※参考URL
●塗り分けの方法
●知恵袋の立方体の色の塗り分け問題をPythonで解いてみた。
●知恵袋の正八面体の色の塗り分け問題をPythonで解いてみた。