문제
https://www.acmicpc.net/problem/17144
걸린 시간
01 : 46 : 42
풀이
C++
#include <bits/stdc++.h>
#define INF 1e9
#define all(c) c.begin(), c.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int r, c, t, A;
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1}; // N E S W
int dr[4] = {-1, 1, -1, 1}; // S E N W
int before[50][50], after[50][50];
vector<pair<int, int>> robot;
void diffusion(){
for(int y = 0; y < r; y++){
for(int x = 0; x < c; x++){
if(before[y][x] <= 0) continue;
for(int i = 0; i < 4; i++){
int ny = y+dy[i];
int nx = x+dx[i];
if(0 <= ny && ny < r && 0 <= nx && nx < c && before[ny][nx] != -1){
after[ny][nx] += before[y][x]/5;
after[y][x] -= before[y][x]/5;
}
}
}
}
for(int y = 0; y < r; y++)
for(int x = 0; x < c; x++)
before[y][x] = after[y][x];
}
void cleaning(){
int cy, cx, ny, nx;
// up
cy = robot[0].first;
cx = robot[0].second;
ny = cy;
nx = cx;
for(int i = 0; i < 4; i++){
while(true){
ny = cy+dy[i];
nx = cx+dx[i];
if(0 > ny || robot[0].first+1 <= ny || 0 > nx || c <= nx) break;
// 시작 지점일 때
if(before[cy][cx] == -1){
cy = ny;
cx = nx;
continue;
}
// 마지막 지점일 때
if(before[ny][nx] == -1){
before[cy][cx] = 0;
cy = ny;
cx = nx;
continue;
}
// 인접한 칸 일 때
before[cy][cx] = before[ny][nx];
cy = ny;
cx = nx;
}
}
// down
cy = robot[1].first;
cx = robot[1].second;
ny = cy;
nx = cx;
for(int i = 0; i < 4; i++){
while(true){
ny = cy+dy[i]*dr[i];
nx = cx+dx[i]*dr[i];
if(robot[1].first > ny || r <= ny || 0 > nx || c <= nx) break;
// 시작 지점일 때
if(before[cy][cx] == -1){
cy = ny;
cx = nx;
continue;
}
// 마지막 지점일 때
if(before[ny][nx] == -1){
before[cy][cx] = 0;
cy = ny;
cx = nx;
continue;
}
// 인접한 칸 일 때
before[cy][cx] = before[ny][nx];
cy = ny;
cx = nx;
}
}
for(int y = 0; y < r; y++)
for(int x = 0; x < c; x++)
after[y][x] = before[y][x];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> r >> c >> t;
for(int y = 0; y < r; y++){
for(int x = 0; x < c; x++){
cin >> A;
before[y][x] = after[y][x] = A;
if(A == -1) robot.push_back(make_pair(y, x));
}
}
while(t--){
diffusion();
cleaning();
}
int ans = 0;
for(int y = 0; y < r; y++)
for(int x = 0; x < c; x++)
if(before[y][x] > 0) ans += before[y][x];
cout << ans;
return 0;
}
좌표의 범위 설정, 갱신 부분의 구현이 꼼꼼하지 못해 문제풀이에 시간이 많이 걸렸다.
'Baekjoon' 카테고리의 다른 글
Baekjoon 2638번 치즈 (0) | 2020.12.09 |
---|---|
Baekjoon 14938번 서강그라운드 (0) | 2020.12.09 |
Baekjoon 15681번 트리와 쿼리 (0) | 2020.12.04 |
Baekjoon 11404번 플로이드 (0) | 2020.12.03 |
Baekjoon 7682번 틱택토 (0) | 2020.12.03 |
댓글