[λ°±μ€] π₯ 20057 λ§λ²μ¬ μμ΄μ ν λ€μ΄λ
π λμ΄λ
π₯ Gold 3
π λ¬Έμ
https://www.acmicpc.net/problem/20057
π νμ΄
μ΄ λ¬Έμ λ₯Ό μ²μ 보μ λ μκ°μ N1913 λ¬ν½μ΄ λ¬Έμ μλ€.
νμ§λ§, κ·Έ λΉμ λ¬Έμ λ₯Ό ν λ, μ μμ μΈ λ°©λ²μΈ μ€μμμ νΌμ Έλκ°λ λ°©λ²μ΄ μλλΌ, μΈκ°μͺ½μμλΆν° νκ³ λ€μ΄μ€λ λ°©μμΌλ‘ ꡬνν΄μ, λ€μ μ€μμμ νΌμ§λ λ°©μμΌλ‘ ꡬνμ νλ €κ³ νλκΉ λ무λλ μ΄λ €μ λ€.
μ²μ 1μκ°λμμ μ€μμμ νΌμ Έλκ°λ λ°©λ²μ λν΄μ κ³ λ―Όνλ€.
λ€μ κ·Έλ¦Όμ²λΌ μ€μμ 1κ°λΆν° μμν΄μ 2, 4, 6, 8...
μ κ°μ λ°©μμΌλ‘ ꡬννλ €κ³ νμλ€.
νμ§λ§ λ무λλ μ΄λ €μμ ꡬμνλ κ²μ ν¬κΈ°νκ³ λ€λ₯Έ λ°©λ²μ μκ°νκΈ° μμνλ€.
κ·Έλ¬λ€κ° λκ² λ³΅μ‘ν λ€λ₯Έ λ°©λ²μ λ μ¬λ Έλλ°, λ°λ‘ λ€μκ³Ό κ°μ΄ ν¬κΈ°κ° 1λΆν° μμνμ¬ 2κ·Έλ£Ήλ§λ€ 1μ© μ¦κ°νλ©΄μ, λ°©ν₯μ ν κ·Έλ£Ήμ΄ λλλ©΄ λ°λ‘ λ°λλ κ·Έλ° λ°©μμ μ€μμμ λ»μ΄κ°λ λ°©λ²μ΄μλ€.
μ΄ν, μ΄λ₯Ό μ΄μ©νμ¬ ν λ€μ΄λλ₯Ό μ΄λμν€κ³ , ν λ€μ΄λκ° μ΄λνλ©΄ λͺ¨λκ° μμ§μΌ μ μκ², MoveSand
ν¨μλ₯Ό μ΄μ©νμ¬, λͺ¨λλ₯Ό μ΄λμμΌ μ£Όμλ€.
μ΄λ SLR
μ SLC
λ₯Ό μ΄μ©νμ¬ λͺ¨λκ° μμ§μ¬μΌ νλ μμΉλ₯Ό ꡬν΄μ£Όμλ€.
νμ§λ§ μΌμͺ½μΌλ‘ μ΄λμ μ λμμ§λ§, μ΄λ₯Ό μνμ’μ°μ λ§μΆ° ꡬνν΄λ΄κΈ° μν΄μ λ€μκ³Ό κ°μ΄ 2μ°¨μ μ’νλ₯Ό ꡬν΄μ μμ λμΆν΄λ΄μλ€.
μΌλ¨ 2μ°¨μ λ°°μ΄μ x, y
λ₯Ό κ°κ° Row, Col
μ΄λΌ νμ λ, μ΄λ₯Ό μ’ννλ©΄μΌλ‘ μΉνν΄μ λνλ΄λ©΄ λ€μκ³Ό κ°μ μ’ννλ©΄μ΄ λνλκ² λλ€.
μ²μμ SLR
μ SLC
μ Aμ μ κΈ°μ€μΌλ‘ μ μλ€.
μ΄ λ¬Έμ μ λͺ¨λλ₯Ό μμ§μ΄λ λ°©λ²μ Aλ₯Ό κΈ°μ€μΌλ‘ λ΄€μ λ, μνλμΉμ΄λ―λ‘, λ리λ μ°μ° λμ λμΉμ΄λμμΌλ λκ°μ΄ μλνλ€.
λ°λΌμ Dλ₯Ό ꡬνλ €λ©΄ yμΆμ μ μ λμΉμ΄λ μν€λ©΄ λλ―λ‘, μ¦ row
μ col
κ°μ μλ‘ λ°κΏμ€λ€.
Cμ μ Aμ μ yμΆμ λμΉμ΄λ μν€λ©΄ λλ―λ‘, μ¦ col
μ -1
μ κ³±ν΄μ£Όλ©΄ λλ€.
Bμ μ Dμ μ xμΆμ λμΉμ΄λ μν€λ©΄ λλ―λ‘, Aλ₯Ό κΈ°μ€μΌλ‘ row
μ col
μ λ°κΏμ€ ν, row
μ -1
μ λν΄μ£Όλ©΄ λλ€.
μ΄λ, μ΄λμν¨ μ μ΄ field
μ λ°κΉ₯μ΄λΌλ©΄, OutSand
κ°μ λκ°κ°μ λν΄μ£Όκ³ , μλλ©΄ νλμμ int Sand
μ λν΄μ£Όλ©΄ λλ€.
μ΄μ νΌ κ³¨λ3μ§λ¦¬ νμ΄μ΄λ³Όλ³΄λ€λ μ¬μ΄ λ¬Έμ μΈ κ² κ°μμ§λ§, μνμ’μ°λ‘ λ리λ λ¬Έμ κ° λμμ μνμ μΌλ‘ μ΄λ €μ΄ λ¬Έμ μλ κ² κ°λ€.
κ·Έλλ νμ΄λ΄λκΉ λΏλ―νλ€.. π
π Code
package BOJ.Implements;
import java.io.*;
import java.util.*;
public class N20057 {
static int N;
static int[][] field;
static int OutSand = 0;
static final int[] DR = {0, 1, 0, -1};
static final int[] DC = {-1, 0, 1, 0};
static final int[] SLR = {-2, -1, -1, -1, 0, 1, 1, 1, 2, 0};
static final int[] SLC = {0, -1, 0, 1, -2, -1, 0, 1, 0, -1};
static final int[] SLW = {2, 10, 7, 1, 5, 10, 7, 1, 2};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
StringTokenizer st;
field = new int[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) {
field[i][j] = Integer.parseInt(st.nextToken());
}
}
//ShowAll(new int[]{N / 2, N / 2});
Tornado();
System.out.println(OutSand);
}
static void Tornado() {
int[] pos = new int[]{N / 2, N / 2};
int dir = 0;
OutSand = 0;
int area = 1;
boolean flag = true;
while (true) {
for (int i = 0; i < 2; i++) {
for (int j = 0; j < area; j++) {
pos = new int[]{pos[0] + DR[dir], pos[1] + DC[dir]};
if (pos[0] < 0 || pos[0] >= N || pos[1] < 0 || pos[1] >= N) {
return;
}
MoveSand(pos, dir);
//ShowAll(pos);
}
dir += 1;
if (dir > 3) {
dir = 0;
}
}
area += 1;
}
}
static void MoveSand(int[] pos, int dir) {
int adjx = 1;
if (dir == 1 || dir == 2) {
adjx = -1;
}
int sand = field[pos[0]][pos[1]];
int remainSand = sand;
field[pos[0]][pos[1]] = 0;
for (int i = 0; i < SLW.length; i++) {
if (dir % 2 == 0) {
if (pos[0] + SLR[i] < 0 || pos[0] + SLR[i] >= N || pos[1] + SLC[i] * adjx < 0 || pos[1] + SLC[i] * adjx >= N) {
OutSand += sand * SLW[i] / 100;
remainSand -= sand * SLW[i] / 100;
continue;
}
field[pos[0] + SLR[i]][pos[1] + SLC[i] * adjx] += sand * SLW[i] / 100;
remainSand -= sand * SLW[i] / 100;
} else {
if (pos[0] + SLC[i] * adjx < 0 || pos[0] + SLC[i] * adjx >= N || pos[1] + SLR[i] < 0 || pos[1] + SLR[i] >= N) {
OutSand += sand * SLW[i] / 100;
remainSand -= sand * SLW[i] / 100;
continue;
}
field[pos[0] + SLC[i] * adjx][pos[1] + SLR[i]] += sand * SLW[i] / 100;
remainSand -= sand * SLW[i] / 100;
}
}
if (dir % 2 == 0) {
if (pos[0] + SLR[9] < 0 || pos[0] + SLR[9] >= N || pos[1] + SLC[9] * adjx < 0 || pos[1] + SLC[9] * adjx >= N) {
OutSand += remainSand;
} else {
field[pos[0] + SLR[9]][pos[1] + SLC[9] * adjx] += remainSand;
}
} else {
if (pos[0] + SLC[9] < 0 * adjx || pos[0] + SLC[9] * adjx >= N || pos[1] + SLR[9] < 0 || pos[1] + SLR[9] >= N) {
OutSand += remainSand;
} else {
field[pos[0] + SLC[9] * adjx][pos[1] + SLR[9]] += remainSand;
}
}
}
static void ShowAll(int[] pos) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (pos[0] == i && pos[1] == j) {
System.out.print(field[i][j] + ")");
} else {
System.out.print(field[i][j] + " ");
}
}
System.out.println();
}
System.out.println("=====================================");
}
}
package (μ΄λ¦); λ₯Ό λκ³ , class μ΄λ¦μ Main
μΌλ‘ λ³κ²½νλ©΄ λλ€.
π μΆκ° μμ
[Input]
5
0 0 0 0 0
0 0 0 0 0
0 10 0 0 0
0 0 0 0 0
0 0 0 0 0
[Output]
10
[Input]
5
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 10 0 0 0
0 0 0 0 0
[Output]
10
[Input]
5
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 10 0
0 0 0 0 0
[Output]
10
[Input]
5
0 0 0 0 0
0 0 0 0 0
0 0 0 10 0
0 0 0 0 0
0 0 0 0 0
[Output]
10
κ°μΈ κ³΅λΆ κΈ°λ‘μ© λΈλ‘κ·Έμ
λλ€.
ν리거λ μ€λ₯κ° μμ κ²½μ° μ 보ν΄μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.π