반응형
주사위굴리기 문제를 풀어봤다면, 비교적 쉽게 풀 수 있는 문제였다.
이 문제의 유형은 주사위 전개도로 확실히 정해져 있기에, 추가 유형에 대한 문제가 나오긴 어렵겠지만
전개도에 관련한 문제를 어떻게 풀면 좋을까에 대한 답으로, 이렇게 쉽게 1차원적 배열로 나열하여 규칙성에 대해서만 캐치하면 된다는 생각을 배워간다고 보면 된다.
전개도를 직접 그려보면 생각에 엄청난 도움이 된다
숫자의 규칙이 어떻게 변하는지를 보고, 함수를 구현하면 된다.
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int N, M, K;
int MAP[20][20];
bool VISIT[20][20];
int mx[4] = {0, 1, 0, -1};
int my[4] = {1, 0, -1, 0};
int SX = 0, SY = 0, DIR = 0;
int TOTAL_SCORE = 0, SCORE = 0;
int DICE[6] = {1, 2, 3, 4, 5, 6}; // 1이 천장, 6이 바닥
void left_roll() {
int t = DICE[0];
DICE[0] = DICE[2];
DICE[2] = DICE[5];
DICE[5] = DICE[3];
DICE[3] = t;
}
void right_roll() {
int t = DICE[0];
DICE[0] = DICE[3];
DICE[3] = DICE[5];
DICE[5] = DICE[2];
DICE[2] = t;
}
void bottom_roll() {
int t = DICE[0];
DICE[0] = DICE[1];
DICE[1] = DICE[5];
DICE[5] = DICE[4];
DICE[4] = t;
}
void top_roll() {
int t = DICE[0];
DICE[0] = DICE[4];
DICE[4] = DICE[5];
DICE[5] = DICE[1];
DICE[1] = t;
}
void dfs(int x, int y) {
VISIT[x][y] = true;
SCORE += MAP[x][y];
for(int i = 0; i < 4; i++) {
int xx = x + mx[i];
int yy = y + my[i];
if(xx < 0 || xx >= N || yy < 0 || yy >= M)
continue;
if(!VISIT[xx][yy] && MAP[xx][yy] == MAP[x][y])
dfs(xx, yy);
}
}
int main() {
cin >> N >> M >> K;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> MAP[i][j];
}
}
while(K--) {
memset(VISIT, 0, sizeof(VISIT));
SCORE = 0;
int xx = SX + mx[DIR];
int yy = SY + my[DIR];
if(xx < 0 || xx >= N || yy < 0 || yy >= M) {
DIR = (DIR + 2) % 4;
xx = SX + mx[DIR];
yy = SY + my[DIR];
}
dfs(xx, yy);
TOTAL_SCORE += SCORE;
switch(DIR) {
case 0:
right_roll();
break;
case 1:
bottom_roll();
break;
case 2:
left_roll();
break;
case 3:
top_roll();
break;
}
if(DICE[5] > MAP[xx][yy])
DIR = (DIR + 1) % 4;
else if(DICE[5] < MAP[xx][yy]) {
DIR--;
if(DIR < 0)
DIR = 3;
} else ;
SX = xx; SY = yy;
}
cout << TOTAL_SCORE << "\n";
}
started at 23:40
ended at 00:17
반응형
'[백준]' 카테고리의 다른 글
[BaekJoon/백준 21609번 상어 중학교 (1) | 2022.10.13 |
---|---|
[BaekJoon/백준] 17144번 미세먼지 안녕! (0) | 2022.10.10 |
[BaekJoon/백준] 20058번 마법사 상어와 파이어스톰 (0) | 2022.10.09 |
[BaekJoon/백준] 20056번 마법사 상어와 파이어볼 (0) | 2022.10.08 |
[BaekJoon/백준] 21610번 마법사 상어와 비바라기 (0) | 2022.10.06 |