問題:
神経衰弱と呼ばれるトランプゲームのシミュレーションを行います。数字が書かれたトランプを縦 H 枚、横 W 枚の長方形の形に並べた状態でスタートします。トランプには1〜13の数字のうちどれかが書かれており、同じ数字のトランプが複数存在します。プレイヤーが N 人おり、各プレイヤーがトランプをめくっていき、めくった2枚のトランプに同じ数字が書かれていればそのトランプを取り除きます。ゲームの初期状態とトランプの記録が与えられるので、各プレイヤーが取り除いたトランプの枚数を求めます。
入力値:
H W N
t_{1,1} t_{1,2} ... t_{1,W}
t_{2,1} t_{2,2} ... t_{2,W}
...
t_{H,1} t_{H,W}
L
a_1 b_1 A_1 B_1
a_2 b_2 A_2 B_2
...
a_L b_L A_L B_L
期待される出力値:
各プレイヤーが取り除いたトランプの枚数を出力してください
条件:
- 1 ≦ H, W ≦ 13
- H × W は52以下の2の倍数
- 2 ≦ N ≦ 10
- t_{i,j} は 1 〜 13 のいずれか
- トランプには同じ数字が2枚または4枚存在
- 1 ≦ L ≦ 200
- 1 ≦ a_i, A_i ≦ H
- 1 ≦ b_i, B_i ≦ W
- (a_i, b_i) ≠ (A_i, B_i)
Pythonプログラム:
import sys
input = sys.stdin.read
def main():
# 入力を読み込む
data = input().strip().split()
index = 0
# H: 縦の枚数, W: 横の枚数, N: プレイヤーの数
H = int(data[index])
W = int(data[index + 1])
N = int(data[index + 2])
index += 3
# トランプの状態を読み込む
cards = []
for i in range(H):
row = []
for j in range(W):
row.append(int(data[index]))
index += 1
cards.append(row)
# L: 記録の長さ
L = int(data[index])
index += 1
# 各プレイヤーが取り除いたトランプの枚数
removed_counts = [0] * N
# ゲームの記録を処理する
current_player = 0
for _ in range(L):
a, b, A, B = map(lambda x: int(x) - 1, data[index:index + 4])
index += 4
# 取り除いたトランプの値を確認
if cards[a][b] == cards[A][B]:
# 同じ値のトランプを取り除く
removed_counts[current_player] += 2
cards[a][b] = -1 # -1 は取り除かれたことを示す
cards[A][B] = -1
else:
# 異なる値のトランプの場合は次のプレイヤーに移る
current_player = (current_player + 1) % N
# 各プレイヤーの取り除いたトランプの枚数を出力
for count in removed_counts:
print(count)
if __name__ == "__main__":
main()
コードの説明:
-
入力値の読み込み:
import sys input = sys.stdin.read
-
main 関数:
def main(): data = input().strip().split() index = 0 H = int(data[index]) W = int(data[index + 1]) N = int(data[index + 2]) index += 3 cards = [] for i in range(H): row = [] for j in range(W): row.append(int(data[index])) index += 1 cards.append(row) L = int(data[index]) index += 1 removed_counts = [0] * N current_player = 0 for _ in range(L): a, b, A, B = map(lambda x: int(x) - 1, data[index:index + 4]) index += 4 if cards[a][b] == cards[A][B]: removed_counts[current_player] += 2 cards[a][b] = -1 cards[A][B] = -1 else: current_player = (current_player + 1) % N for count in removed_counts: print(count)
実行方法:
このプログラムは、標準入力からのデータを処理し、各プレイヤーが取り除いたトランプの枚数を標準出力に出力します。