atcoder ABC319 C - False Hopeの勉強

atcoder.jp

・参考
ABC319をPythonで解いてみたよ。(A~E問題) - Qiita

・説明
 基本的には参考記事を参考にして、問題文の通りに実装した。
 工夫としては

f=[]
for _ in range(3):
    a,b,c=map(int,input().split())
    f.append(a)
    f.append(b)
    f.append(c)

と入力を受け取ることで、そのまま見ていく順列の位置posに対して、f[pos]で値を取ってこれるようにした。

from itertools import permutations
import math
f=[]
for _ in range(3):
    a,b,c=map(int,input().split())
    f.append(a)
    f.append(b)
    f.append(c)
    
tmp=[[0,1,2],[0,3,6],[3,4,5],[6,7,8],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]  #当てはまる縦横斜め.8こある.

P=permutations([i for i in range(9)])

cnt=0
#for perm in permutations(range(9)):  #for perm in P:と同じ。
for perm in P:
    flag=1
    for t in tmp:
        T=[]
        for pos in t:  #tは[0,1,2]とかでposは0,1,2とか.
            T.append((perm[pos], f[pos]))    #perm[pos]が何番目にpos地点を見たか表す
        T.sort()  #見た順にする.
        if T[0][1]==T[1][1] and T[1][1]!=T[2][1]:  #がっかりするとき.
            flag=0
            break
    if flag:   #がっかりしなかったときをカウントする.
        cnt+=1
print(cnt/math.factorial(9))