0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

paizaラーニング問題集「【全探索 4】ストラックアウト」を解いてみた

Last updated at Posted at 2024-10-21

▼考え方

この問題を解くために私が考えた内容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)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?