알고리즘/BOJ

백준 14499번 주사위 굴리기

꾸준함. 2019. 4. 30. 22:52

문제 링크입니다: 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

어느 정도의 공간지각능력을 요구하는 문제였습니다.

주사위를 돌리면 해당 면이 어느 위치에 가는지를 잘 파악하고 그대로 함수를 작성해주면 쉽게 풀 수 있는 문제였습니다.

문제에 조건이 많기 때문에 조건을 잘 읽어줘야하고 그 것을 그대로 구현할 수 있는 능력이 있어야합니다.

 

#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;
}
view raw .cpp hosted with ❤ by GitHub

 

 

개발환경:Visual Studio 2017

 

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~

반응형

'알고리즘 > 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