https://www.acmicpc.net/problem/17144
#include <iostream>
using namespace std;
#define fastio() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int N, K, T, purifier, ans;
int maps[55][55];
int dy[4] = {1, 0, -1, 0};
int dx[4] = {0, 1, 0, -1};
void input();
void init();
void solve();
void move();
void purify();
int main() {
fastio();
input();
solve();
return 0;
}
void input() {
fastio();
cin >> N >> K >> T;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++) {
cin >> maps[i][j];
if (maps[i][j] == -1) purifier = i; // 공기청정기 위치를 알기 위해서
}
}
init(); // 범위 제한을 하기 위해서
}
void init() { // 범위 제한을 하기 위해서
for (int i = 0; i < N + 1; i++) maps[i][0] = -1;
for (int i = 0; i < N + 1; i++) maps[i][K + 1] = -1;
for (int i = 0; i < K + 1; i++) maps[0][i] = -1;
for (int i = 0; i < K + 1; i++) maps[N + 1][i] = -1;
}
void solve() {
while (T--) {
move(); // 확산
purify(); // 공기청정기
}
for (int i = 1; i <= N; i++) { // 결과
for (int j = 1; j <= K; j++) {
if (maps[i][j] != -1) ans += maps[i][j];
}
}
cout << ans;
}
void move() {
int tmp[55][55]; // 동시에 확산되기에 다 확산하고 나서 더해준다.
for (int i = 1; i <= N; i++) { // 초기화
for (int j = 1; j <= K; j++) {
tmp[i][j] = 0;
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++) {
if (0 < maps[i][j]) {
int cnt = 0;
for (int k = 0; k < 4; k++) {
if (maps[i + dy[k]][j + dx[k]] != -1) {
tmp[i + dy[k]][j + dx[k]] += int(maps[i][j] / 5);
cnt++;
}
}
tmp[i][j] -= int(maps[i][j] / 5) * cnt;
}
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++) {
maps[i][j] += tmp[i][j];
}
}
}
void purify() {
int tmp[55][55]; // 동시에 이동하기에 tmp를 사용한다.
for (int i = 1; i <= N; i++) { // 초기화
for (int j = 1; j <= K; j++) {
tmp[i][j] = 0;
}
}
// 공기청정기와 같은 라인
for (int i = 2; i < K; i++) {
tmp[purifier - 1][i + 1] = maps[purifier - 1][i];
tmp[purifier][i + 1] = maps[purifier][i];
}
// 오른쪽 끝
for (int i = purifier; i < N; i++) {
tmp[i + 1][K] = maps[i][K];
}
for (int i = purifier - 1; i > 1; i--) {
tmp[i - 1][K] = maps[i][K];
}
// 맨 밑과 맨 위
for (int i = K; i > 1; i--) {
tmp[1][i - 1] = maps[1][i];
tmp[N][i - 1] = maps[N][i];
}
// 왼쪽 끝
for (int i = 1; i < purifier; i++) {
tmp[i + 1][1] = maps[i][1];
}
for (int i = N; i > purifier; i--) {
tmp[i - 1][1] = maps[i][1];
}
// 복사
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= K; j++) {
if (i == 1 or j == 1 or i == N or j == K or i == purifier - 1 or i == purifier) {
if (maps[i][j] != -1) maps[i][j] = tmp[i][j];
}
}
}
}
|
cs |
풀이:
시뮬레이션 문제입니다.
'백준(C, C++) > 골드' 카테고리의 다른 글
백준 17070: 파이프 옮기기 1 [C/C++], 삼성 코딩 테스트 (0) | 2022.06.13 |
---|---|
백준 12100: 2048(Easy) [C언어], 삼성 코딩 테스트 (0) | 2022.06.13 |
백준 20056: 마법사 상어와 파이어볼 [C/C++], 삼성 코딩 테스트 (0) | 2022.06.12 |
백준 14503: 로봇 청소기 [C/C++], 삼성 코딩 테스트 (0) | 2022.06.12 |
백준 3078: 좋은 친구 [C/C++] (0) | 2022.06.11 |