AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。
出典:
AtCoder Regular Contest 005 B – P-CASカードと高橋君
制約も緩いので解き方はいろいろあると思う。
反射を考える時は縦と横を独立に考えると楽。
# AtCoder Regular Contest 005 B - P-CASカードと高橋君
# https://atcoder.jp/contests/arc005/tasks/arc005_2
# tag: グリッド 反射 高橋君
# 反射するのをどう扱うか考える問題。
# 解き方はいろいろあると思われる。
def main():
x, y, w = input().split()
x = int(x) - 1
y = int(y) - 1
field = [[c for c in input()] for _ in range(9)]
dx, dy = 0, 0
if 'U' in w:
dy -= 1
if 'D' in w:
dy += 1
if 'L' in w:
dx -= 1
if 'R' in w:
dx += 1
result = []
# ここでは、0123456787654321をワンセットと考え、
# まず %= 16 したあと、前半部ならそのまま、
# 後半部なら折り返す……みたいな発想で求めている。
# このやり方は(今回は必要ないが)、何度も反射を
# 繰り返す場合でも対応可能。
for i in range(4):
now_x = x % 16 if x % 16 < 9 else 16 - x % 16
now_y = y % 16 if y % 16 < 9 else 16 - y % 16
result.append(field[now_y][now_x])
x += dx
y += dy
print(''.join(result))
main()
関連