[BOJ]14499サイコロを投げるc++


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

using namespace std;

int N, M, x, y, K;
int dir;
int map[20][20];

int dice[6] = {0,};

int dx[5] = {0, 0, 0, -1, 1};
int dy[5] = {0, 1, -1, 0, 0};

// 윗 뒷 오른 왼 앞 밑

void move() {
  int a, b, c, d;
  int nx = x + dx[dir];
  int ny = y + dy[dir];

  if(!(-1 < nx && nx < N && -1 < ny && ny < M))
    return;

  x = nx;
  y = ny;

  switch(dir) {
    case 1:
      a = dice[0];
      b = dice[2];
      c = dice[3];
      d = dice[5];
      dice[0] = c;
      dice[2] = a;
      dice[3] = d;
      dice[5] = b;
      break;
    case 2:
      a = dice[0];
      b = dice[2];
      c = dice[3];
      d = dice[5];
      dice[0] = b;
      dice[2] = d;
      dice[3] = a;
      dice[5] = c;
      break;
    case 3:
      a = dice[0];
      b = dice[1];
      c = dice[4];
      d = dice[5];
      dice[0] = c;
      dice[1] = a;
      dice[4] = d;
      dice[5] = b;
      break;
    case 4:
      a = dice[0];
      b = dice[1];
      c = dice[4];
      d = dice[5];
      dice[0] = b;
      dice[1] = d;
      dice[4] = a;
      dice[5] = c;
      break;
  }

  if(map[x][y] == 0) {
    map[x][y] = dice[5];
  }
  else {
    dice[5] = map[x][y];
    map[x][y] = 0;
  }

  printf("%d\n", dice[0]);
}

int main() {
  scanf("%d %d %d %d %d", &N, &M, &x, &y, &K);
  for(int i = 0; i < N; i++) {
    for(int j = 0; j < M; j++) {
      scanf("%d", &map[i][j]);
    }
  }

  for(int i = 0; i < K; i++) {
    scanf("%d", &dir);
    move();
  }
}
お疲れ様でした.🤯