백준
백준14499 - 주사위 굴리기
개발하는꼬마
2019. 9. 17. 00:25
https://www.acmicpc.net/problem/14499
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마
www.acmicpc.net
어려운 알고리즘을 사용하지 않고 문제만 잘 이해하면 풀 수 있는 문제였다. 첫번째로 주의할 점은 주사위를 굴릴 때 정해놓은 칸 밖으로 벗어나지 말아야한다. 두번째로 주의할 점은 칸에 적힌 수가 0이면 바닥에 있는 수가 칸에 적히고 칸에 있는 수가 0이 아니면 바닥이 되는 수가 칸이 되고 칸은 0으로 바뀐다. 마지막으로 굴리는 방향에 따라 동, 서, 남, 북, 꼭대기, 바닥에 있는 숫자가 달라지기 때문에 이점을 주의해야 한다. 중복된 곳이 있는데 추후에 수정해야겠다.
#include <iostream>
using namespace std;
int mat[20][20]; //칸의 정보
int N, M; //행과 열의 수
int x, y; //시작하는 x, y좌표
int K; //이동횟수
int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0; //a는 꼭대기, b는 북, c는 동, d는 서, e는 남, f는 바닥
int tmp_a, tmp_b, tmp_c, tmp_d, tmp_e, tmp_f; //돌리는 방향에 따라 숫자가 바뀌기 때문에 임시로 저장할 변수
int main() {
cin >> N >> M >> x >> y >> K;
//칸의 정보를 갱신
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> mat[i][j];
}
}
while (K--) {
int num;
cin >> num;
switch (num) {
case 1: //동, a <- d, c <- a, d <- f, f <- c
if (y + 1 > M - 1) { //범위에 벗어나면
break; //탈출
}
else {
y = y + 1;
tmp_a = a;
tmp_b = b;
tmp_c = c;
tmp_d = d;
tmp_e = e;
tmp_f = f;
a = tmp_d;
b = tmp_b;
c = tmp_a;
d = tmp_f;
e = tmp_e;
f = tmp_c;
/*칸이 0이면 주사위 바닥면에 있는 숫자가 들어가고
칸이 0이 아니면 주사위 바닥면에 있는 숫자를 칸의 수로 바꾸고 칸을 0으로 만든다.*/
if (mat[x][y] == 0) {
mat[x][y] = f;
}
else {
f = mat[x][y];
mat[x][y] = 0;
}
cout << a << '\n';
break;
}
case 2: //서, a <- c, c <- f, d <- a, f <- d
if (y - 1 < 0) { //범위에 벗어나면
break; //탈출
}
else {
y = y - 1;
tmp_a = a;
tmp_b = b;
tmp_c = c;
tmp_d = d;
tmp_e = e;
tmp_f = f;
a = tmp_c;
b = tmp_b;
c = tmp_f;
d = tmp_a;
e = tmp_e;
f = tmp_d;
/*칸이 0이면 주사위 바닥면에 있는 숫자가 들어가고
칸이 0이 아니면 주사위 바닥면에 있는 숫자를 칸의 수로 바꾸고 칸을 0으로 만든다.*/
if (mat[x][y] == 0) {
mat[x][y] = f;
}
else {
f = mat[x][y];
mat[x][y] = 0;
}
cout << a << '\n';
break;
}
case 3: //북, a <- e, b <- a, e <- f, f <- b
if (x - 1 < 0) { //범위에 벗어나면
break; //탈출
}
else {
x = x - 1;
tmp_a = a;
tmp_b = b;
tmp_c = c;
tmp_d = d;
tmp_e = e;
tmp_f = f;
a = tmp_e;
b = tmp_a;
c = tmp_c;
d = tmp_d;
e = tmp_f;
f = tmp_b;
/*칸이 0이면 주사위 바닥면에 있는 숫자가 들어가고
칸이 0이 아니면 주사위 바닥면에 있는 숫자를 칸의 수로 바꾸고 칸을 0으로 만든다.*/
if (mat[x][y] == 0) {
mat[x][y] = f;
}
else {
f = mat[x][y];
mat[x][y] = 0;
}
cout << a << '\n';
break;
}
case 4: //남, a <- b, b <- f, e <- a, f <- e
if (x + 1 > N - 1) { //범위에 벗어나면
break; //탈출
}
else {
x = x + 1;
tmp_a = a;
tmp_b = b;
tmp_c = c;
tmp_d = d;
tmp_e = e;
tmp_f = f;
a = tmp_b;
b = tmp_f;
c = tmp_c;
d = tmp_d;
e = tmp_a;
f = tmp_e;
/*칸이 0이면 주사위 바닥면에 있는 숫자가 들어가고
칸이 0이 아니면 주사위 바닥면에 있는 숫자를 칸의 수로 바꾸고 칸을 0으로 만든다.*/
if (mat[x][y] == 0) {
mat[x][y] = f;
}
else {
f = mat[x][y];
mat[x][y] = 0;
}
cout << a << '\n';
break;
}
}
}
}