반응형
이 문제를 풀면서 느낀건, 구현문제는 확실히
print() 함수를 만들어 놓으면 편하다는 점이었다.
그리고 하나하나 코딩하면서, 찍어보면서 점점 완성시켜야지
확인 안하고 마지막에 다 확인하면 문제점이 언제 어디서 발생했는지 찾기 더 어려워지는 것 같다.
이동 방향에 대한 값을 갖고 있는 MOVE 배열을 만들어 주는 점이 중요했다.
그리고, memmove는 정말 자주 쓰이니까 다시 한번 외워두자!
memmove(dst, src, sizeof(src))
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int MAP[50][50];
int MOVE[50][50];
int mx[5] = {0, 0, -1, 0, 1};
int my[5] = {0, 1, 0, -1, 0};
vector<pair<int, int>> ROBOTS;
int R, C, T;
void top_mapping(int x, int y) {
for(int i = y + 1; i < C; i++) {
MOVE[x][i] = 1; // 우 방향
}
for(int i = x; i >= 0; i--) {
MOVE[i][C - 1] = 2; // 상 방향
}
for(int i = 0; i < C; i++) {
MOVE[0][i] = 3; // 좌 방향
}
for(int i = 0; i < x; i++) {
MOVE[i][0] = 4; // 하 방향
}
}
void bottom_mapping(int x, int y) {
for(int i = y + 1; i < C; i++) {
MOVE[x][i] = 1; // 우 방향
}
for(int i = x; i < R; i++) {
MOVE[i][C - 1] = 4; // 하 방향
}
for(int i = 0; i < C; i++) {
MOVE[R - 1][i] = 3; // 좌 방향
}
for(int i = R - 1; i > x ; i--) {
MOVE[i][0] = 2; // 상 방향
}
}
void MOVE_MAPPING() {
top_mapping(ROBOTS[0].first, ROBOTS[0].second);
bottom_mapping(ROBOTS[1].first, ROBOTS[1].second);
// for(int i = 0; i < R; i++) {
// for(int j = 0; j < C; j++) {
// cout << MOVE[i][j] << " ";
// }
// cout << "\n";
// }
//
}
// 확산
void SPREAD() {
int T_MAP[50][50];
memset(T_MAP, 0, sizeof(T_MAP));
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
int Cnt = 0;
for(int k = 1; k <= 4; k++) {
int xx = i + mx[k];
int yy = j + my[k];
if(xx < 0 || xx >= R || yy < 0 || yy >= C || MAP[xx][yy] == -1)
continue;
else {
Cnt++;
T_MAP[xx][yy] += (MAP[i][j] / 5);
}
}
T_MAP[i][j] += (MAP[i][j] - (MAP[i][j] / 5) * Cnt);
}
}
memmove(MAP, T_MAP, sizeof(T_MAP)); // dst, src, size
}
void WIND() {
int T_MAP[50][50];
// 일단 MAP의 내용을 T_MAP에 복사
memset(T_MAP, 0, sizeof(T_MAP));
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
int x = i + mx[MOVE[i][j]];
int y = j + my[MOVE[i][j]];
if(MAP[x][y] == -1) { T_MAP[x][y] = -1; }
else {
T_MAP[x][y] = MAP[i][j];
}
}
}
memmove(MAP, T_MAP, sizeof(T_MAP));
}
void print() {
cout << "\n";
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
cout << MAP[i][j] << " ";
}
cout << "\n";
}
}
void CALCUL() {
int z = 0;
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
// cout << MAP[i][j] << " ";
z+= MAP[i][j];
}
// cout << "\n";
}
cout << z + 2 << "\n"; // -1 두개 로봇청소기꺼 뺴줌
}
int main() {
cin >> R >> C >> T;
for(int i = 0; i < R; i++) {
for(int j = 0; j < C; j++) {
cin >> MAP[i][j];
if(MAP[i][j] == -1) {
ROBOTS.push_back({i, j});
}
}
}
MOVE_MAPPING();
while(T--) {
SPREAD(); // 정상작동 확인완료
// print();
WIND();
// print();
}
CALCUL();
}
21:54 ~ 22:50
반응형
'[백준]' 카테고리의 다른 글
백준 11286번 절댓값 힙 (0) | 2023.08.10 |
---|---|
[BaekJoon/백준 21609번 상어 중학교 (1) | 2022.10.13 |
[BaekJoon/백준] 23288번 주사위 굴리기 2 (0) | 2022.10.10 |
[BaekJoon/백준] 20058번 마법사 상어와 파이어스톰 (0) | 2022.10.09 |
[BaekJoon/백준] 20056번 마법사 상어와 파이어볼 (0) | 2022.10.08 |