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~5까지로 대응시킨다.
명령을 하나씩 받아서, 먼저 이동할 수 있는지 판단한다. 동쪽이면 동쪽으로 벗어날 것이고, 남쪽이면 남쪽으로 벗어날 것이고 이런 식으로 확인할 수 있다.
지도를 벗어나지 않는다면, 명령에 맞춰서 주사위를 회전해주면 된다. 회전 방향에 따라 주사위의 상태를 갱신해주고, 주사위의 위치를 변경해준다.
이후에 조건에 맞게 출력을 해주면 된다.
#include<iostream>
using namespace std;
int dice[6];
int Row, Col, srcR, srcC, cnt, m[20][20];
void Move(int dir) {
int temp;
if (dir == 1) { //동쪽으로 굴릴 때
if (srcC + 1>= Col) return;
//주사위 회전, 좌표 이동
//남2 북3 그대로
temp = dice[0];
dice[0] = dice[4];
dice[4] = dice[1];
dice[1] = dice[5];
dice[5] = temp;
srcC++;
}
else if (dir == 2) { //서
if (srcC - 1 < 0) return;
temp = dice[1];
dice[1] = dice[4];
dice[4] = dice[0];
dice[0] = dice[5];
dice[5] = temp;
srcC--;
}
else if (dir == 3) { //북
if (srcR - 1 < 0) return;
temp = dice[3];
dice[3] = dice[4];
dice[4] = dice[2];
dice[2] = dice[5];
dice[5] = temp;
srcR--;
}
else { //남
if (srcR + 1 >= Row) return;
temp = dice[2];
dice[2] = dice[4];
dice[4] = dice[3];
dice[3] = dice[5];
dice[5] = temp;
srcR++;
}
if (m[srcR][srcC] == 0) {
m[srcR][srcC] = dice[5];
}
else {
dice[5] = m[srcR][srcC];
m[srcR][srcC] = 0;
}
cout << dice[4] << '\n';
}
int main(void) {
cin >> Row >> Col >> srcR >> srcC >> cnt;
for (int i = 0; i < Row; i++) {
for (int j = 0; j < Col; j++) {
cin >> m[i][j];
}
}
while (cnt--) {
int op;
cin >> op;
Move(op);
}
return 0;
}'알고리즘 문제 풀이 > 백준 온라인 저지' 카테고리의 다른 글
| 백준 13335번: 트럭 (C++) (0) | 2019.07.25 |
|---|---|
| 백준 5014번: 스타트링크 (C++) (0) | 2019.07.24 |
| 백준 1547번: 공 (C++) (0) | 2019.07.24 |
| 백준 2146번: 다리 만들기 (C++) (0) | 2019.07.24 |
| 백준 1799번: 비숍 (C++) (0) | 2019.07.24 |