문제 링크입니다: 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
어느 정도의 공간지각능력을 요구하는 문제였습니다.
주사위를 돌리면 해당 면이 어느 위치에 가는지를 잘 파악하고 그대로 함수를 작성해주면 쉽게 풀 수 있는 문제였습니다.
문제에 조건이 많기 때문에 조건을 잘 읽어줘야하고 그 것을 그대로 구현할 수 있는 능력이 있어야합니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <algorithm> | |
using namespace std; | |
const int MAX = 20; | |
typedef struct | |
{ | |
int y, x; | |
}Dir; | |
Dir moveDir[4] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} }; | |
int N, M, y, x, K; | |
int graph[MAX][MAX]; | |
//전개도: {0, 2, 0}, {4, 1, 3}, {0, 5, 0}, {0, 6, 0} | |
int dice[4][3] = { {0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0} }; | |
int temp[4][3]; | |
void copy(void) | |
{ | |
for (int i = 0; i < 4; i++) | |
for (int j = 0; j < 3; j++) | |
temp[i][j] = dice[i][j]; | |
} | |
//북쪽으로 굴린다 | |
void north(void) | |
{ | |
copy(); | |
for (int i = 0; i < 4; i++) | |
dice[i][1] = temp[(i + 1) % 4][1]; | |
} | |
//남쪽으로 굴린다 | |
void south(void) | |
{ | |
copy(); | |
for (int i = 0; i < 4; i++) | |
dice[i][1] = temp[(i + 3) % 4][1]; | |
} | |
//동쪽으로 굴린다 | |
void east(void) | |
{ | |
copy(); | |
dice[1][0] = temp[3][1]; | |
dice[1][1] = temp[1][0]; | |
dice[1][2] = temp[1][1]; | |
dice[3][1] = temp[1][2]; | |
} | |
//서쪽으로 굴린다 | |
void west(void) | |
{ | |
copy(); | |
dice[1][0] = temp[1][1]; | |
dice[1][1] = temp[1][2]; | |
dice[1][2] = temp[3][1]; | |
dice[3][1] = temp[1][0]; | |
} | |
//문제의 조건 | |
void func(int y, int x) | |
{ | |
//해당 칸에 숫자가 있다면 | |
if (graph[y][x]) | |
{ | |
//해당 숫자를 주사위에 복사하고 | |
dice[3][1] = graph[y][x]; | |
//해당 칸에 있는 숫자를 0으로 초기화 | |
graph[y][x] = 0; | |
} | |
//해당 칸에 숫자가 없다면 | |
else | |
//주사위 바닥면에 있는 숫자를 해당 칸에 복사 | |
graph[y][x] = dice[3][1]; | |
//주사위 윗면을 출력 | |
cout << dice[1][1] << "\n"; | |
} | |
int main(void) | |
{ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
cin >> N >> M >> y >> x >> K; | |
pair<int, int> cur = { y, x }; | |
for (int i = 0; i < N; i++) | |
for (int j = 0; j < M; j++) | |
cin >> graph[i][j]; | |
for (int k = 0; k < K; k++) | |
{ | |
int op; | |
cin >> op; | |
//범위를 벗어날 경우 출력하지 않는다. | |
switch (op) | |
{ | |
case 1: | |
if (cur.second + 1 < M) | |
{ | |
east(); | |
cur.second += 1; | |
func(cur.first, cur.second); | |
} | |
break; | |
case 2: | |
if (cur.second - 1 >= 0) | |
{ | |
west(); | |
cur.second -= 1; | |
func(cur.first, cur.second); | |
} | |
break; | |
case 3: | |
if (cur.first - 1 >= 0) | |
{ | |
north(); | |
cur.first -= 1; | |
func(cur.first, cur.second); | |
} | |
break; | |
case 4: | |
if (cur.first + 1 < N) | |
{ | |
south(); | |
cur.first += 1; | |
func(cur.first, cur.second); | |
} | |
break; | |
} | |
} | |
return 0; | |
} |


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
반응형
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2290번 LCD Test (0) | 2019.05.02 |
---|---|
백준 3190번 뱀 (5) | 2019.05.01 |
백준 5373번 큐빙 (0) | 2019.04.29 |
백준 14503번 로봇 청소기 (2) | 2019.04.28 |
백준 15662번 톱니바퀴(2) (0) | 2019.04.27 |