반응형
14499번: 주사위 굴리기
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지도
www.acmicpc.net
풀이 )
문제를 풀기에 앞서 주사위를 어떻게 표현할지를 생각해봐야한다.
주사위의 삼면을 정하면 나머지 삼면은 고정되기 때문에 윗면, 오른쪽면, 앞면을 각각 diceU, diceR, diceF로 설정했다.
(아랫면, 왼쪽, 뒷면은 각각 5-diceU, 5-diceR, 5-diceF(눈의 수 1~6이 아닌 인덱스 0~5로 이루어져있기 때문에))
동, 서, 남, 북에 대해서 순서대로 구현을 했다. (이동에 앞서 바깥으로 이동시키는 경우 해당 명령어를 무시한다.)
- 동쪽 이동: 윗면이 오른쪽면으로 가고, 왼쪽면이 윗면으로 간다.
- 서쪽 이동: 윗면이 왼쪽면으로 가고, 오른쪽면이 윗면으로 간다.
- 남쪽 이동: 윗면이 앞면으로 가고, 뒷면이 윗면으로 간다.
- 북쪽 이동: 윗면이 뒷면으로 가고, 앞면이 윗면으로 간다.
이후 지도를 확인하여
- 0인 경우 주사위 밑면(dice[5-diceU])의 값을 지도 칸에 저장하고
- 0이 아닌 경우 지도의 값을 주사위 밑면에 저장하고, 해당 지도 칸의 값을 0으로 만든다.
마지막으로 주사위의 윗면의 수(dice[diceU])를 출력한다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> map;
int dice[6] = {0, };
int diceU = 0, diceR = 2, diceF = 4;
int x, y;
void move_print(void){
if(map[x][y]){
dice[5-diceU] = map[x][y];
map[x][y] = 0;
}
else
map[x][y] = dice[5-diceU];
cout << dice[diceU] << '\n';
}
int main(void){
int n, m, k;
cin >> n >> m >> x >> y >> k;
for(int i = 0; i < n; ++i){
vector<int> tmp;
for(int j = 0; j < m; ++j){
int cell;
cin >> cell;
tmp.push_back(cell);
}
map.push_back(tmp);
}
while(k--){
int com;
cin >> com;
if(com == 1){
if(y == m-1)
continue;
y++;
swap(diceU, diceR);
diceU = 5-diceU;
}
else if(com == 2){
if(y == 0)
continue;
y--;
swap(diceU, diceR);
diceR = 5-diceR;
}
else if(com == 3){
if(x == 0)
continue;
x--;
swap(diceU, diceF);
diceF = 5-diceF;
}
else{
if(x == n-1)
continue;
x++;
swap(diceU, diceF);
diceU = 5-diceU;
}
move_print();
}
return 0;
}
주의 )
- 문제에서 주어지는 좌표 x, y의 순서에 유의한다. (세로, 가로)
반응형
'문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 - 1065 : 한수 (0) | 2020.12.07 |
---|---|
[C++] 백준 - 17144 : 미세먼지 안녕! (0) | 2020.12.07 |
[C++] 백준 - 1874 : 스택 수열 (0) | 2020.12.01 |
[C++] 백준 - 10773 : 제로 (0) | 2020.12.01 |
[C++] 백준 - 5430 : AC (0) | 2020.11.30 |