[白俊14499号]サイコロを投げる


https://www.acmicpc.net/problem/14499

1.コード

import sys

ans = []
n, m, x, y, c = map(int, sys.stdin.readline().rstrip().split())
graph = []
for i in range(n):
    graph.append(list(map(int, sys.stdin.readline().rstrip().split())))
commands = list(map(int, sys.stdin.readline().rstrip().split()))[:]
d = [0] * 7
dx = [0, 0, 0, -1, 1]  # 동쪽[1], 서쪽[2], 북쪽[3], 남쪽[4]
dy = [0, 1, -1, 0, 0]
for i in range(c):
    for j in range(1, 5):
        if commands[i] == j:
            nx = x + dx[j]
            ny = y + dy[j]
            if 0 <= nx < n and 0 <= ny < m:
                t1, t2 = d[1], d[2]
                t3, t4 = d[3], d[4]
                t5, t6 = d[5], d[6]
                if j == 1:
                    d[1], d[2] = t3, t4
                    d[3], d[4] = t2, t1
                elif j == 2:
                    d[1], d[2] = t4, t3
                    d[3], d[4] = t1, t2
                elif j == 3:
                    d[1], d[2] = t5, t6
                    d[5], d[6] = t2, t1
                elif j == 4:
                    d[1], d[2] = t6, t5
                    d[5], d[6] = t1, t2
                if graph[nx][ny] == 0:
                    graph[nx][ny] = d[2]
                else:
                    d[2] = graph[nx][ny]
                    graph[nx][ny] = 0
                ans.append(d[1])
                x, y = nx, ny
for i in ans:
    print(i)

2.後期

# 각 인덱스는 항상 한글로 적힌 면을 나타낸다. 
d[1=윗면], d[2=아랫면], d[3=왼쪽면], d[4=오른쪽면], d[5=앞면], d[6=뒷면]
ルールを探すときは、以下のように絵を描いてルールを探します.

  • 任意の初期値をd[i]=iの順に入力します.(値が反対側として識別可能な値の場合、i以外の値を追加できます)

  • 東にスクロールすると、既存のd[3=左側]に対応する値がd[1=上]であると判断できます.
    ->東へスクロールするときにd[1]=d[3]を実行する

  • 繰り返し