백준/14499/simulation/주사위 굴리기

유기태·2022년 6월 2일
0

백준/14499/simulation/주사위 굴리기
구현 문제로 직접 주사위를 굴려보는등 시간이 오래걸렸다.
결과값을 도출하는 과정은
1. 맵에서 주사위가 현재 존재하는 위치
2. 주사위가 맵에 맞닿은 면의 종류
3. 그 맞닿는 면적과 대칭되는 면 구하기

pair<int, int> cur = { x,y };
	for (int i = 0; i < K; i++) {
		cin >> tmp;
		s.push(tmp);
	}

1번 과정은 cur이라는 pair변수에 x,y 즉, 주사위가 시작하는 위치를 입력하고
dx,dy 배열에 동 서 북 남으로 움직이게 끔 숫자를 입력해놓고 s이름을 붙인 queue에 입력한 움직이는 순서를 뽑아서 현재 위치를 구합니다.

if (cur.first < 0 || cur.first >= N || cur.second < 0 || cur.second 	>= M) {
			cur.first -= dx[tmp - 1];
			cur.second -= dy[tmp - 1];
			continue;
		}
...

현재 위치가 지도 밖으로 갈경우 현재 위치를 되돌리고 다음 움직이는 방향을 s에서 뺍니다.

1번 과정은 쉬웠으나 2,3번 과정이 구상하기가 매우 힘들었습니다.
처음 생각한 로직은 주사위 전개도에 번호를 매기고 지도에 맞닿은 면을 cur_dice라 하고 그와 마주보는 면을 back_dice라 하여 구하는 방법입니다.
처음 생각한 로직은 주사위 전개도에서 동 서 북 남 중 북쪽을 기준으로 할 방향으로 정하고 다이스를 굴려 보려 했으나, 주사위가 굴거나느 로직을 정확히 파악하지 못해 구현에 실패했습니다.

void dice_move(int a) {
	int tmp1 = dice[0];
	int tmp2 = dice[1];
	int tmp3 = dice[2];
	int tmp4 = dice[3];
	int tmp5 = dice[4];
	int tmp6 = dice[5];
	if (a == 1) {	
		dice[5] = tmp4;
		dice[3] = tmp1;
		dice[0] = tmp3;
		dice[2] = tmp6;
	}
	else if (a == 2) {
		dice[5] = tmp3;
		dice[2] = tmp1;
		dice[0] = tmp4;
		dice[3] = tmp6;
	}
	else if (a == 3) {
		dice[5] = tmp2;
		dice[4] = tmp6;
		dice[0] = tmp5;
		dice[1] = tmp1;
	}
	else {
		dice[5] = tmp5;
		dice[1] = tmp6;
		dice[0] = tmp2;
		dice[4] = tmp1;
	}
}

다음 로직으로 동 서 남 북으로 윗면 아랫면을 고정해놓고 동 서 남 북으로 돌려보아
어느면이 윗쪽으로 바뀌고 어느면이 아랫쪽으로 바뀌는지 전개도를 그려보고 로직을 구현했습니다.

풀이

1.첫번째 풀이

#include<iostream>
#include<queue>
#include<utility>
#include<vector>
using namespace std;

int map[20][20];
int N, M;
int x, y;
int K;
queue<int>s;

int dice[6];

void func();
void solution();
void dice_move(int);

int dx[4] = { 0,0,-1,+1 };
int dy[4] = { 1,-1,0,0 };

int result;

void func() {
	pair<int, int> cur = { x,y };
	while (!s.empty()) {
		int tmp = s.front(); s.pop();
		cur.first += dx[tmp-1];
		cur.second += dy[tmp - 1];
		if (cur.first < 0 || cur.first >= N || cur.second < 0 || cur.second >= M) {
			cur.first -= dx[tmp - 1];
			cur.second -= dy[tmp - 1];
			continue;
		}
		dice_move(tmp);
		if (map[cur.first][cur.second] == 0) {
			map[cur.first][cur.second] = dice[5];
		}
		else {
			dice[5] = map[cur.first][cur.second];
			map[cur.first][cur.second] = 0;
		}
		result = dice[0];
		/*
		for (int i = 0; i < 6; i++) {
			cout << dice[i] << " ";
		}
		cout << "\n";
		cout << "tmp : " << tmp << '\n';
		*/
		solution();
	}
}

void dice_move(int a) {
	int tmp1 = dice[0];
	int tmp2 = dice[1];
	int tmp3 = dice[2];
	int tmp4 = dice[3];
	int tmp5 = dice[4];
	int tmp6 = dice[5];
	if (a == 1) {	
		dice[5] = tmp4;
		dice[3] = tmp1;
		dice[0] = tmp3;
		dice[2] = tmp6;
	}
	else if (a == 2) {
		dice[5] = tmp3;
		dice[2] = tmp1;
		dice[0] = tmp4;
		dice[3] = tmp6;
	}
	else if (a == 3) {
		dice[5] = tmp2;
		dice[4] = tmp6;
		dice[0] = tmp5;
		dice[1] = tmp1;
	}
	else {
		dice[5] = tmp5;
		dice[1] = tmp6;
		dice[0] = tmp2;
		dice[4] = tmp1;
	}
}


void solution() {
	cout << result << '\n';
}


int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	int tmp = 0;
	cin >> N >> M >> x >> y >> K;

	for (int i = 0; i < N; i++)
		for (int j = 0; j < M; j++)
			cin >> map[i][j];

	for (int i = 0; i < K; i++) {
		cin >> tmp;
		s.push(tmp);
	}

	func();
}
profile
게임프로그래머 지망!

0개의 댓글