-
[백준 23288] 주사위 굴리기C 프로그래밍/BOJ 2022. 10. 10. 15:41728x90
https://www.acmicpc.net/problem/23288
#include <cstdio> #include <cstring> #include <queue> int R, C; int board[20 + 2][20 + 2]; int K; // 1000 까지 int total; struct _st { int x, y; }; std::queue<_st> Q; int visited[20 + 2][20 + 2]; // 0동 1남 2서 3북 int dir_x[4] = { 0, 1, 0, -1 }; int dir_y[4] = { 1, 0, -1, 0 }; int dir_op[4] = { 2, 3, 0, 1 }; int sx, sy; // 초기위치(0, 0) int sdir; // 초기방향 동쪽0 int dice[7] = { 0, 1, 2, 3, 4, 5, 6 }; void input() { scanf("%d %d %d", &R, &C, &K); for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { scanf("%d", &board[i][j]); } } } void update_dice(int dir) { int n1 = dice[1], n2 = dice[2], n3 = dice[3], n4 = dice[4], n5 = dice[5], n6 = dice[6]; switch (dir) { case 0: // 동 dice[1] = n4; dice[3] = n1; dice[4] = n6; dice[6] = n3; break; case 1: // 남 dice[1] = n2; dice[2] = n6; dice[5] = n1; dice[6] = n5; break; case 2: // 서 dice[1] = n3; dice[3] = n6; dice[4] = n1; dice[6] = n4; break; case 3: // 북 dice[1] = n5; dice[2] = n1; dice[5] = n6; dice[6] = n2; break; } } void move() { int nx = sx + dir_x[sdir]; int ny = sy + dir_y[sdir]; if (nx < 0 || nx > R - 1 || ny < 0 || ny > C - 1) { int ndir = dir_op[sdir]; nx = sx + dir_x[ndir]; ny = sy + dir_y[ndir]; sdir = ndir; } sx = nx, sy = ny; update_dice(sdir); //printf("%d %d %d\n", sx, sy, sdir); } int get_score() { Q = {}; memset(visited, 0, sizeof(visited)); Q.push({ sx, sy }); // 현위치 visited[sx][sy] = 1; int type = board[sx][sy]; int cann = 1; // 자신이 현재 지금 있는 칸 포함 while (!Q.empty()) { _st data = Q.front(); Q.pop(); for (int p = 0; p < 4; p++) { int nx = data.x + dir_x[p]; int ny = data.y + dir_y[p]; if (nx < 0 || nx > R - 1 || ny < 0 || ny > C - 1) continue; if (visited[nx][ny]) continue; if (board[nx][ny] != type) continue; Q.push({ nx, ny }); visited[nx][ny] = 1; cann++; } } return cann * type; } void get_dir() { int A = dice[6]; int B = board[sx][sy]; if (A > B) sdir = (sdir + 1) % 4; if (A < B) sdir = (sdir + 3) % 4; if (A == B) sdir = sdir; //printf("A: %d B: %d dir:%d\n", A, B, sdir); } void simul() { for (int k = 0; k < K; k++) { move(); total += get_score(); get_dir(); } } int main() { input(); simul(); printf("%d\n", total); return 0; }
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 21680] 상어 초등학교 (0) 2022.10.12 [백준 20058] 마법사 상어와 파이어스톰 (0) 2022.10.11 [백준 17144] 미세먼지 안녕! (0) 2022.10.10 [백준 17779] 게리맨더링 2 (0) 2022.10.10 [백준 20057] 마법사 상어와 토네이도 (0) 2022.10.10