https://www.acmicpc.net/problem/17144
17144번: 미세먼지 안녕!
미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사
www.acmicpc.net
솔루션
3차원 배열을 선언을 해서 [2][R][C]를 통해서 확산이 된 후 배열을 [0][R][C]->[1][R][C] 또는 [1][R][C]->[0][R][C]로
바꿔 주고, while문을 통해서 공기 청정기를 순환을 시켜줬습니다!
그리고 바꾼 배열은 모두 다 0으로 다시 초기화를 해 주고 그 다음 T일 때를 연산결과를 넣어줍니다!
코드
#include <iostream>
using namespace std;
int arr[2][51][51];
int R, C, T;
int dx[4] = { 1,0,-1,0 };
int dy[4] = { 0,1,0,-1 };
int cyclex, cycley;
void cycleMachine(int idx) {
//윗 부분 순환
int tx = cyclex-1;
int ty = cycley;
int sum = 0;
while (tx > 0) {
arr[idx][tx][ty] = arr[idx][tx - 1][ty];
tx--;
}
while (ty < C-1) {
arr[idx][tx][ty] = arr[idx][tx][ty + 1];
ty++;
}
while (tx < cyclex) {
arr[idx][tx][ty] = arr[idx][tx + 1][ty];
tx++;
}
while (ty > 0) {
if (arr[idx][tx][ty - 1] == -1) {
arr[idx][tx][ty] = 0;
break;
}
arr[idx][tx][ty] = arr[idx][tx][ty - 1];
ty--;
}
//아랫부분 순환.
tx = cyclex + 2;
ty = cycley;
while (tx < R - 1) {
arr[idx][tx][ty] = arr[idx][tx + 1][ty];
tx++;
}
while (ty < C - 1) {
arr[idx][tx][ty] = arr[idx][tx][ty + 1];
ty++;
}
while (tx > cyclex + 1) {
arr[idx][tx][ty] = arr[idx][tx - 1][ty];
tx--;
}
while (ty > 0) {
if (arr[idx][tx][ty - 1] == -1) {
arr[idx][tx][ty] = 0;
break;
}
arr[idx][tx][ty] = arr[idx][tx][ty - 1];
ty--;
}
return;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> R >> C >> T;
bool is_visit = false;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> arr[0][i][j];
if (arr[0][i][j] == -1) {
arr[1][i][j] = -1;
//공기 청정기의
//위쪽 인덱스를 기준으로 잡음.
if (is_visit) continue;
is_visit = true;
cyclex = i;
cycley = j;
}
}
}
bool idx = false;
while (T--) {
idx = !idx;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if ((arr[!idx][i][j]) == 0 || arr[!idx][i][j] == -1) continue;
int div = arr[!idx][i][j] / 5;
int cnt = 0;
for (int k = 0; k < 4; k++) {
if (i + dx[k] >= 0 && i + dx[k]<R) {
if (j + dy[k] >= 0 && j + dy[k] < C) {
if (arr[idx][i + dx[k]][j + dy[k]] != -1) {
//범위 안이고,
// 공기 청정기 아니면,
//먼지 옮겨주기,
arr[idx][i + dx[k]][j + dy[k]] += div;
cnt++;
}
}
}
}//확산 된 양 만큼 먼지 뺴 주기,
arr[!idx][i][j] -= (div * cnt);
}
}
//다 확산이 끝났으면,
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (arr[!idx][i][j] == -1) continue;
arr[idx][i][j] += arr[!idx][i][j];
arr[!idx][i][j] = 0;
}
}//옮긴 먼지 다시 0으로 만들기,
//그리고 미세먼지 순환 시키기,
cycleMachine(idx);
}
//그리고 합계 구하기.
int sum = 0;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (arr[idx][i][j] == -1)continue;
sum += arr[idx][i][j];
}
}
cout << sum << "\n";
}
'백준' 카테고리의 다른 글
C++ [백준]1967번 트리의 지름 (0) | 2022.04.07 |
---|---|
C++ [백준] 13549번 숨바꼭질3 (0) | 2022.04.07 |
C++ [백준]10868번 최솟값 (0) | 2022.04.07 |
C++ [백준]15657번 N과 M(8) (0) | 2022.04.05 |
C++ [백준]1504번 특정한 최단 경로 (0) | 2022.04.05 |