[BOJ]14499サイコロを投げるc++
18691 ワード
質問する
サイズN×M人マップが存在します.地図の右側は東で、上は北です.この地図にはサイコロが置いてあり、サイコロの展開図は以下の通りです.地図の座標は(r,c)で表され,rは北から来た格の個数,cは西から来た格の個数である.
地図の各段には整数が書いてあります.サイコロを投げると、移動した四角形の数字が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
サイズ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();
}
}
お疲れ様でした.🤯Reference
この問題について([BOJ]14499サイコロを投げるc++), 我々は、より多くの情報をここで見つけました https://velog.io/@chowisely/BOJ-14499テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol