リバーシの操作(縦横) (paizaランク C 相当) 

今回のプログラミングの記事は、「リバーシの操作」です。オセロで同じ色の間をひっくり返す感じに似ています。

解答例では、行と列をそれぞれ独立して関数を定義し、最初に置かれる石とその周りの石の間を埋めるかどうかについて判断していました。

筆者は、行と列の評価関数は分けずに、同時に評価することでコーディングの行数を減らしています。探索方向を決めるのに、配列drで、あらかじめ最初の石から上下左右にマスを調べる「方向」の座標値を設定しておき、参照するインデックス値を「0〜3」まで回転させることで、コーディング量を減らすことができました。後は、条件に合うまでWhileで繰り返しています。

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

    d+=1

for e in s:
    print("".join(e))