https://www.acmicpc.net/problem/17144
그냥 무지성으로 문제의 조건에 맞게 해결하면 된다.
끝!!!
import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static int[] dx = {-1, 0, 0, 1};
static int[] dy = {0, -1, 1, 0};
static int r, c;
static int t;
static int[][] room;
static ArrayList<Integer> airCleaner;
public static void main(String[] args) throws IOException {
// write your code here
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] first = br.readLine().split(" ");
r = Integer.parseInt(first[0]);
c = Integer.parseInt(first[1]);
t = Integer.parseInt(first[2]);
room = new int[r][c];
airCleaner = new ArrayList<>();
for (int i = 0; i < r; i++) {
String[] line = br.readLine().split(" ");
for (int j = 0; j < line.length; j++) {
int a = Integer.parseInt(line[j]);
if (a == -1)
airCleaner.add(i);
room[i][j] = a;
}
}
for (int i = 0; i < t; i++) {
spreadDust();
//printRoom();
refresh();
//printRoom();
}
int answer = calcDust();
bw.write(answer+"\n");
bw.close();
br.close();
}
private static void spreadDust() {
Queue<Pair> queue = new LinkedList<>();
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (room[i][j] > 0) {
queue.offer(new Pair(i, j, room[i][j]));
}
}
}
while (!queue.isEmpty()) {
Pair p = queue.poll();
int count = 0;
for (int i = 0; i < 4; i++) {
int nx = p.x + dx[i];
int ny = p.y + dy[i];
if ((nx >= 0 && nx < r) && (ny >= 0 && ny < c)) {
if (room[nx][ny] != -1) {
room[nx][ny] = room[nx][ny] + (p.dust / 5);
count++;
}
}
}
room[p.x][p.y] = room[p.x][p.y] - p.dust + p.dust - ((p.dust / 5) * count);
}
}
private static void refresh() {
int upper = airCleaner.get(0);
int down = airCleaner.get(1);
int next = room[0][0];
for (int i = 0; i < upper; i++) {
if (room[i + 1][0] != -1) {
int temp = room[i + 1][0];
room[i + 1][0] = next;
next = temp;
}
}
for (int i = 1; i < c; i++) {
room[0][i - 1] = room[0][i];
}
for (int i = 0; i < upper; i++) {
room[i][c - 1] = room[i + 1][c - 1];
}
next = room[upper][1];
room[upper][1] = 0;
for (int i = 2; i < c; i++) {
int temp = room[upper][i];
room[upper][i] = next;
next = temp;
}
for (int i = down + 1; i < r - 1; i++) {
room[i][0] = room[i + 1][0];
}
for (int i = 1; i < c; i++) {
room[r - 1][i - 1] = room[r - 1][i];
}
next = room[down][c - 1];
for (int i = down + 1; i < r; i++) {
int temp = room[i][c -1];
room[i][c - 1] = next;
next = temp;
}
next = room[down][1];
room[down][1] = 0;
for (int i = 2; i < c; i++) {
int temp = room[down][i];
room[down][i] = next;
next = temp;
}
}
private static int calcDust() {
int answer = 0;
for(int i = 0;i<r;i++) {
for(int j = 0;j<c;j++) {
if(room[i][j] > 0)
answer += room[i][j];
}
}
return answer;
}
private static void printRoom() {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
System.out.print(room[i][j] + " ");
}
System.out.println();
}
System.out.println("----------------");
}
}
class Pair {
public int x;
public int y;
public int dust;
public Pair(int x, int y, int dust) {
this.x = x;
this.y = y;
this.dust = dust;
}
}