-
[BOJ] 14499번 주사위 굴리기알고리즘/BOJ 2020. 7. 11. 13:08
해당 문제 링크
https://www.acmicpc.net/problem/14499
아이디어
1, 시뮬례이션 문제
2, 서쪽, 동쪽, 북쪽, 남쪽으로 각각 주사위를 굴릴 경우 주사위의 상태를 저장해 주고 지도의 상태를 갱신하여 준다.
예시)
만약 주사위를 남쪽으로 굴렸을 경우
윗쪽 -> 앞쪽으로
앞쪽 -> 아래쪽으로
아래쪽 -> 뒷쪽
뒷쪽 -> 윗쪽
굴린이후 해당 문제의 조건의 맞게 지도 혹은 주사위를 갱신하여 준다.
3, 시간복잡도 O(K)
소스코드
#include <cstdio> using namespace std; int up = 0; int down = 0; int front = 0; int back = 0; int right = 0; int left = 0; int n, m, x, y, k; int map[20][20]; int move_dice[1000]; //동쪽 움직임 void east_action() { int temp_up = up; int temp_down = down; int temp_front = front; int temp_back = back; int temp_right = right; int temp_left = left; right = temp_up; down = temp_right; left = temp_down; up = temp_left; } //서쪽 움직임 void west_action() { int temp_up = up; int temp_down = down; int temp_front = front; int temp_back = back; int temp_right = right; int temp_left = left; up = temp_right; left = temp_up; down = temp_left; right = temp_down; } //북쪽 움직임 void north_action() { int temp_up = up; int temp_down = down; int temp_front = front; int temp_back = back; int temp_right = right; int temp_left = left; up = temp_front; back = temp_up; down = temp_back; front = temp_down; } //남쪽 움직임 void south_action() { int temp_up = up; int temp_down = down; int temp_front = front; int temp_back = back; int temp_right = right; int temp_left = left; front = temp_up; down = temp_front; back = temp_down; up = temp_back; } int main() { scanf("%d", &n); scanf("%d", &m); scanf("%d", &x); scanf("%d", &y); scanf("%d", &k); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &map[i][j]); } } for (int i = 0; i < k; i++) { scanf("%d", &move_dice[i]); } for (int i = 0; i < k; i++) { //동 if (move_dice[i] == 1) { int nx = x; int ny = y + 1; if (nx < 0 || nx >= n || ny < 0 || ny >= m) { continue; } east_action(); if (map[nx][ny] == 0){ map[nx][ny] = down; } else{ down = map[nx][ny]; map[nx][ny] = 0; } x = nx; y = ny; } //서 else if (move_dice[i] == 2) { int nx = x; int ny = y - 1; if (nx < 0 || nx >= n || ny < 0 || ny >= m) { continue; } west_action(); if (map[nx][ny] == 0){ map[nx][ny] = down; } else { down = map[nx][ny]; map[nx][ny] = 0; } x = nx; y = ny; } //북 else if (move_dice[i] == 3) { int nx = x - 1; int ny = y; if (nx < 0 || nx >= n || ny < 0 || ny >= m) { continue; } north_action(); if (map[nx][ny] == 0) { map[nx][ny] = down; } else { down = map[nx][ny]; map[nx][ny] = 0; } x = nx; y = ny; } //남 else if (move_dice[i] == 4) { int nx = x+1; int ny = y; if (nx < 0 || nx >= n || ny < 0 || ny >= m) { continue; } south_action(); if (map[nx][ny] == 0) { map[nx][ny] = down; } else { down = map[nx][ny]; map[nx][ny] = 0; } x = nx; y = ny; } printf("%d\n", up); } return 0; }
'알고리즘 > BOJ' 카테고리의 다른 글
[BOJ] 14889 스타트와 링크 (0) 2020.07.26 [BOJ] 14888 연산자 끼워넣기 (0) 2020.07.26 [BOJ] 11055번 가장 큰 증가 부분 수열 (0) 2020.07.11 [BOJ]11053번 가장 긴 증가하는 부분 수열 (0) 2020.07.11 [BOJ] 17825번 주사위 윷놀이 (0) 2020.07.09