1449.サイコロを投げる


1.問題の紹介


サイズN×M人マップが存在します.地図の右側は東で、上は北です.この地図にはサイコロが置いてあり、サイコロの展開図は以下の通りです.地図の座標は(r,c)で表され,rは北から来た格の個数,cは西から来た格の個数である.
2
4 1 3
5
6
サイコロは地図上に置いてあり、上は1、東向きは3、置いた場所の座標は(x,y).最初はサイコロの各面に0と書いてありました.
地図の各段には整数が書いてあります.サイコロを投げると、移動した四角形の数字が0の場合、サイコロの底の数字が四角形にコピーされます.0でない場合、セルの数値はサイコロの底面にコピーされ、セルの数値は0になります.
サイコロの座標と移動コマンドが与えられた場合、サイコロを移動するたびに上記の値が要求されるプログラムを作成します.
サイコロは地図の外に移動できません.外に移動する場合は、コマンドを無視し、出力できません.

2.解決プロセス


これは実施問題です.展開図を見て、まず東、西、南、北が同時にどのように番号を変えたのかを思い出し、事前に番号をメモした.これにより,東西南北各入力時にサイコロ番号を自動的に変換する関数を実現し,底面条件と範囲外のコマンドを無視した.

3.コード

N, M, y, x, K = map(int, input().split())   # N세로
Map = [list(map(int, input().split())) for _ in range(N)]
comm = list(map(int, input().split()))
dice = [0,0,0,0,0,0]    # 처음 주사위

def rota(n):
    if n == 1:
        dice[1], dice[3], dice[4],dice[5] = dice[4], dice[5],dice[3],dice[1]
    elif n == 2:
        dice[1], dice[3],dice[4], dice[5] = dice[5],dice[4],dice[1],dice[3]
    elif n ==3 :
        dice[0], dice[1], dice[2],dice[3]  = dice[1],dice[2],dice[3],dice[0]
    else:
        dice[0],dice[1], dice[2],dice[3] = dice[3], dice[0], dice[1],dice[2]

    return

def pr():
    if Map[y][x] == 0:
        Map[y][x]=dice[3]
    else:
        dice[3] = Map[y][x]
        Map[y][x] = 0
    print(dice[1])


for i in comm:
    if i == 1 and x+1 <M:   # 동쪽 이동
        x +=1
        rota(i)
        pr()    # 지도 내에서만 주사위 번호 교체 및 프린트

    elif i == 2 and x-1 >= 0:   # 서쪽 이동
        x -=1
        rota(i)
        pr()

    elif i ==3 and y-1 >=0: # 북쪽이동
        y -=1
        rota(i)
        pr()

    elif i == 4 and y+1 <N: # 남쪽 이동
        y+=1
        rota(i)
        pr()

4.感じたことと学んだこと


問題を理解するのは一番難しい問題だ.もし本当にcoteだったら、私はただ問題を理解するのに時間を費やしただけで、解決できないと思います.問題をすばやく正確に理解する練習をしなければならない.範囲を超えたら命令そのものを無視し、これらの条件も最初から実施しなければならないと述べた.
サイコロ番号を置き換えると、1行に複数のインデックスが交換されると、既存の値に基づいて変更されます.