いびつなリバーシ対戦 (paizaランク A 相当)

今回は、前回の応用で、プレイヤーN人のリバーシ対戦問題です。

配列drとwhileで探索、穴埋めする方針は、最小限の修正で問題を解くことができました。

プレイヤー番号は、inputから与えられるので、そのまま変数pに格納します。プレイヤー番号順で進む訳ではなく、与えられたプレイヤー番号がランダムに石を置くので、プレイヤー番号を配列に入れて回す必要がありませんでした。そのため、プレイヤー人数である変数Nは使う必要ありません。

# coding: utf-8
# 自分の得意な言語で
# Let's チャレンジ!!
h,w,N,n= [int(x)for x in input().split()]
s=[list(input()) for _ in range(h)]
for _ in range(n):
    p,y,x=input().split()
    y,x=int(y),int(x)
    #print(s)
    dr=[[-1,0],[0,-1],[+1,0],[0,1],[-1,-1],[1,1],[1,-1],[-1,1]]
    d=0
    s[y][x]=p
    for _ in range(8):
        ty,tx=y+dr[d%8][0],x+dr[d%8][1]
        i,j=ty,tx
        while i>=0 and i<=h-1 and j>=0 and j<=w-1 and s[i][j]!="#":
                if s[i][j]==p:
                    while i!=ty or j!=tx:
                        s[ty][tx]=p
                        ty,tx=ty+dr[d%8][0],tx+dr[d%8][1]
                    break
                else:
                    i,j=i+dr[d%8][0],j+dr[d%8][1]
        d+=1
for e in s:
    print("".join(e))