-
[백준 17144] 미세먼지 안녕!C 프로그래밍/BOJ 2022. 10. 10. 15:39728x90
https://www.acmicpc.net/problem/17144
#include <cstdio> #include <vector> #include <cstring> #include <algorithm> int R, C, T; int A[50 + 2][50 + 2]; // 원본 맵 int S[50 + 2][50 + 2]; // 확산 맵 std::vector<int> AC; void debug() { printf("======================================\n"); for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { printf("%d ", S[i][j]); } printf("\n"); } } void input() { scanf("%d %d %d", &R, &C, &T); for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { scanf("%d", &A[i][j]); if (A[i][j] == -1) AC.push_back(i); // 공기청정기 행번호 받기 } } } void spread_it() { static int dir_x[4] = { 0, 0, 1, -1 }; static int dir_y[4] = { 1, -1, 0, 0 }; for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { if (A[i][j] == 0) continue; int current = A[i][j]; int dust = current / 5; for (int p = 0; p < 4; p++) { int ni = i + dir_x[p]; int nj = j + dir_y[p]; if (ni < 1 || ni > R || nj < 1 || nj > C) continue; // 영역 밖이라면 확산되지 않는다. if (A[ni][nj] == -1) continue; // 공기청정기가 있는 쪽이라면 확산되지 않는다. S[ni][nj] += dust; current -= dust; } S[i][j] += current; } } //debug(); } void clean_it() { // 1. 위쪽 하방향 for (int i = AC[0] - 1; i >= 2; i--) { S[i][1] = S[i - 1][1]; } // 2. 위쪽 좌방향 for (int j = 1; j < C; j++) { S[1][j] = S[1][j + 1]; } // 3. 위쪽 상방향 for (int i = 1; i < AC[0]; i++) { S[i][C] = S[i + 1][C]; } // 4. 위쪽 우방향 for (int j = C; j >= 3; j--) { S[AC[0]][j] = S[AC[0]][j - 1]; } S[AC[0]][2] = 0; // 1. 아래쪽 상방향 for (int i = AC[1] + 1; i < R; i++) { S[i][1] = S[i + 1][1]; } // 2. 아래쪽 좌방향 for (int j = 1; j < C; j++) { S[R][j] = S[R][j + 1]; } // 3. 아래쪽 하방향 for (int i = R; i > AC[1]; i--) { S[i][C] = S[i - 1][C]; } // 4. 아래쪽 우방향 for (int j = C; j >= 3; j--) { S[AC[1]][j] = S[AC[1]][j - 1]; } S[AC[1]][2] = 0; //debug(); } void copy_SA() { std::fill(&A[0][0], &A[0][0] + sizeof(A) / sizeof(int), 0); memcpy(A, S, sizeof(S)); A[AC[0]][1] = -1; // 공기청정기 위 A[AC[1]][1] = -1; // 아래 표시 std::fill(&S[0][0], &S[0][0] + sizeof(S) / sizeof(int), 0); } void simulation() { for (int t = 0; t < T; t++) { spread_it(); clean_it(); copy_SA(); } } int output() { int sum = 0; for (int i = 1; i <= R; i++) { for (int j = 1; j <= C; j++) { if (A[i][j] == 0 || A[i][j] == -1) continue; sum += A[i][j]; } } return sum; } int main() { input(); simulation(); int ans = output(); printf("%d\n", ans); return 0; }
728x90'C 프로그래밍 > BOJ' 카테고리의 다른 글
[백준 20058] 마법사 상어와 파이어스톰 (0) 2022.10.11 [백준 23288] 주사위 굴리기 (0) 2022.10.10 [백준 17779] 게리맨더링 2 (0) 2022.10.10 [백준 20057] 마법사 상어와 토네이도 (0) 2022.10.10 [백준 20056] 마법사 상어와 파이어볼 (0) 2022.10.10