▼考え方
この問題を解くために私が考えた内容1.~6.を以下に示します。
1.9枚の数字のパネルを倒す順番の順列をすべて洗い出し、それぞれについて獲得できる得点を求めます。その中の最大値を答えとして出力します。
2.ただし、9枚のパネルのうち最初の2枚については、題意にあるとおりビンゴによる加算(b_i_j点)はなく、パネルを倒した時の加算(s_i点)のみです。
3.9枚のパネルのうち最初の2枚を除く7枚については、題意にあるとおりビンゴによる加算(b_i_j点)があり得ます。パネルを倒す順番によってb_i_j点が異なるため、7枚の順列をすべて洗い出して処理を行います。順列の洗い出しにはモジュールitertoolsを使用します。
paiza君がパネルを倒す順番はリストpi(pitching)で示しています。piの一例を示します。
pi = [3,2,1,4,5,6,8,7,9]
・3→2→1→4→5→6→8→7→9の順にパネルを倒すことを示します。
・3は変数i、2は変数jで構成されます。
・1以降はリストpn(pitching next)で構成されたものを、考え方4のforループで1つずつpnからpiへappendされます。
4.7枚のパネルを1つずつ、パネルを倒した時の加算とビンゴによる加算を計算します。
5.ビンゴによる加算は、ビンゴの組合せを定義した辞書bcをもとに計算します。
6.7枚の順列の1つに対して、パネルを倒した時の加算とビンゴによる加算の計算が終了したら、次の順列の処理をおこなうため、その7つの数字を削除します。
▼コード
########## 処理0(準備) モジュールインポート,インプット,リスト定義 ###########
# 考え方3.
import itertools
# s: パネルを倒した時の加算の点数を定義した辞書
s = {}
for i in range(3):
a,b,c = map(int,input().split())
s[i*3+1] = a
s[i*3+2] = b
s[i*3+3] = c
# bc: ビンゴの組合せを定義した辞書
bc = {}
bc[1] = [[2,3],[4,7],[5,9]]
bc[2] = [[1,3],[5,8]]
bc[3] = [[1,2],[5,7],[6,9]]
bc[4] = [[1,7],[5,6]]
bc[5] = [[1,9],[2,8],[3,7],[4,6]]
bc[6] = [[3,9],[4,5]]
bc[7] = [[1,4],[3,5],[8,9]]
bc[8] = [[2,5],[7,9]]
bc[9] = [[1,5],[3,6],[7,8]]
# bk: ビンゴによる加算の点数を定義した辞書
bk = {}
for i in range(1,10):
bk[i] = list(map(int,input().split()))
# pi: paiza君がパネルを倒す順番を定義したリスト(pitching)
pi = []
# pn: paiza君がパネルを倒す順番(3枚目以降)を定義したリスト(pitching next)
pn = []
# bc_count: パネルを倒したことによって、発生するビンゴの数
bc_count = 0
# score: paiza君が獲得できる得点
score = 0
# max_score: paiza君が獲得できる最高得点
max_score = 0
########## 処理1 paiza君が獲得できる最高得点を求める処理 ###########
# 考え方1.
for i in range(1,10):
for j in range(i,10):
if i == j:
continue
# 考え方2.
pi.append(i)
pi.append(j)
score = s[i]+s[j]
# 考え方3.
pn = list(set(range(1,10))-{i,j})
for k in itertools.permutations(pn):
# 考え方4.
for l in range(7):
pi.append(k[l])
score += s[k[l]]
# 考え方5.
for m in bc[k[l]]:
if all(num in pi for num in m):
bc_count += 1
if bc_count > 0:
score += bk[k[l]][bc_count-1]
bc_count = 0
if max_score < score:
max_score = score
score = s[i]+s[j]
# 考え方6.
del pi[-7:]
del pi[:]
print(max_score)