知恵袋の正八面体の色の塗り分け問題をPythonで解いてみた。(2)

 知恵袋の正八面体の色の塗り分け問題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で解いてみた。