/*지도 크기 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;
}
'이것저것' 카테고리의 다른 글
미로찾기 문제 소스 (0) | 2017.10.31 |
---|---|
nqueen 알고리즘 (0) | 2017.10.31 |
c++ topological sort (0) | 2017.10.05 |
c언어 dfs bfs 코드 (0) | 2017.09.30 |
옛날 웝페이지를 볼 수 있는 온라인 디지털 도서관, 인터넷 아카이브! (0) | 2017.08.21 |
댓글