본문 바로가기
이것저것

백준 14499번 주사위굴리기

by 문자메일 2017. 10. 18.

/*지도 크기  N*M

지도 좌표 (r,c), r: 북쪽으로부터, c: 서쪽으로부터 떨어진 칸의 갯수


주사위는 지도 위에 윗 면이 1이고, 동쪽을 바라보는 방향이 3인 상태로 놓여져 있으며, 놓여져 있는 곳의 좌표는 (x, y) 이다. 가장 처음에 주사위에는 모든 면에 0이 적혀져 있다.


지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 써 있는 수가 0이면, 주사위의 바닥면에 써 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 써 있는 수가 주사위의 바닥면으로 복사되며, 칸에 써 있는 수는 0이 된다.


주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 써 있는 값을 구하는 프로그램을 작성하시오.


주사위는 지도의 바깥으로 이동시킬 수 없다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시해야 하며, 출력도 하면 안된다.


첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.


둘째 줄부터 N개의 줄에 지도에 써 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 써 있는 수는 항상 0이다. 지도의 각 칸에 써 있는 수는 10을 넘지 않는 자연수이다.


마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.

*/

/*

입력

4 2 0 0 8

0 2

3 4

5 6

7 8

4 4 4 1 3 3 3 2


출력

0

0

3

0

0

8

6

3

*/


/*

주사위의 6면을 구분할 수 있어야 한다. How?

1. 3차원 배열 사용? 아래


입력값에 대한 분기는 4가지 (동,서,북,남)

*/


#include <stdio.h>


int N, M, r, c, k;

int map[20][20];

int dice[7] = { 0, }; // 1바닥, 3오른쪽, 4왼쪽, 5앞, 2뒤, 6위

int rolledDice[7] = { 0, };

int dir = 0;

int x, y;

int next_x, next_y;


void init()

{

for (int i = 0; i < M; i++)

for (int j = 0; j < N; j++)

map[i][j] = -1;

}


/*

지도의 각 칸에는 정수가 하나씩 쓰여져 있다. 주사위를 굴렸을 때, 이동한 칸에 써 있는 수가 0이면, 

주사위의 바닥면에 써 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 써 있는 수가 주사위의 바닥면으로 복사되며,

칸에 써 있는 수는 0이 된다.

*/


void rollDice(int dir)

{

int dice1, dice2, dice3, dice4, dice5, dice6;

dice1 = dice[1]; dice2 = dice[2]; dice3 = dice[3]; dice4 = dice[4]; dice5 = dice[5]; dice6 = dice[6];

//주사위를 굴릴 방향 읽고 함수 실행


switch (dir)

{

//CASE 1, 2 : 앞, 뒤는 바뀌지 않는다.

case 1: //동쪽, 왼쪽 위쪽 오른쪽 아래쪽 순서  4 6 3 1

dice[3] = dice6;

dice[4] = dice1;

dice[1] = dice3;

dice[6] = dice4;

y++; // 동쪽으로 한칸

break;

case 2: //서, 왼쪽 위쪽 오른쪽 아래쪽 순서  4 6 3 1

dice[3] = dice1;

dice[4] = dice6;

dice[1] = dice4;

dice[6] = dice3;

y--;  // 서쪽으로 한칸

break;


//CASE 3, 4 : 오른쪽, 왼쪽은 바뀌지 않는다.

case 3: //북, 앞 위 뒤 아래 순  5 6 2 1

dice[5] = dice1;

dice[6] = dice5;

dice[2] = dice6;

dice[1] = dice2;

x--;//북쪽으로 한칸

break;

case 4: //남,앞 위 뒤 아래 순  5 6 2 1

dice[5] = dice6;

dice[6] = dice2;

dice[2] = dice1;

dice[1] = dice5;

x++;//남쪽으로 한칸

break;

}


//이동한 칸의 수가 0이라면

if (map[x][y] == 0){

map[x][y] = dice[1];

}

//0이 아니라면

else{

dice[1] = map[x][y];

map[x][y] = 0;

}

//맨 위 주사위(6)에 저장된 주사위 숫자 출력

//printf("dice[6] : %d, dice[1] : %d\n ", dice[6], dice[1]);

printf("%d\n", dice[6]);

}



int main()

{


scanf("%d %d %d %d %d", &M, &N, &r, &c, &k);


init();


for (int i = 0; i < M; i++)

for (int j = 0; j < N; j++)

scanf("%d", &map[i][j]);


//다음 지도 좌표가 지도 밖으로 벗어났을 때 실행하지 않음

x = r, y = c;

dice[1] = map[x][y];

for (int i = 0; i < k; i++)

{

next_x = x, next_y = y;

scanf("%d", &dir);

switch (dir)

{

case 1:

next_y++;

break;

case 2: //서, 

next_y--;  // 서쪽으로 한칸

break;

case 3: //북,

next_x--;//북쪽으로 한칸

break;

case 4: //남

next_x++;//남쪽으로 한칸

break;

}

if (M>next_x && next_x >= 0 && N>next_y && next_y >= 0)

{

rollDice( dir);

}

}


return 0;

}


댓글