AOJ1193 連鎖消滅パズル

はじめに

カテゴリー競プロ初中級者100問では、Qiitaにて@e869120さんがレッドコーダーが教える、競プロ・AtCoder上達のガイドライン【中級編:目指せ水色コーダー!】としてまとめられている100問をPythonで解いています。

全問題の一覧はこちらです

問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1193&lang=jp

方針

アルゴリズムやデータ構造の知識は問われませんが、実装量が多いタイプの問題です。

コード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
def move(board): # 空きを埋める関数
board = [list(x) for x in zip(*board)]
for i in range(len(board)):
row = board[i]
row = [i for i in row if i!=0]
n = len(board[i]) - len(row)
row.extend([0]*n)
board[i] = row
board = [list(x) for x in zip(*board)]
return board

ls_ans = []
while(1):
ans = 0
H = int(input())
if H==0:
break
board = []
for h in range(H):
C = list(map(int,input().split()))
board.append(C)
board = board[::-1]
for t in range(H):
for h in range(H):
C = board[h]
changed = set()
old_c = ''
oldold_c = ''
streak = 0
for i,c in enumerate(C):
if c == old_c and c == oldold_c:
if streak == 0:
streak += 3*c
C[i] = C[i-1] = C[i-2] = 0
else:
streak += c
C[i] = 0
else:
ans += streak
streak = 0
oldold_c = old_c
old_c = c
ans += streak
board[h] = C
board = move(board)
ls_ans.append(ans)

for ans in ls_ans:
print (ans)

記事情報

  • 投稿日:2020年5月16日
  • 最終更新日:2020年5月16日