Skip to content

Commit f8af9c7

Browse files
authored
[20251204] BOJ / G3 / 마법사 상어와 토네이도 / 이준희
1 parent 3996535 commit f8af9c7

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
```java
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
7+
static int N;
8+
static int[][] A;
9+
static int answer;
10+
11+
static int[] dx = {0, 1, 0, -1};
12+
static int[] dy = {-1, 0, 1, 0};
13+
14+
static int[][] dsx = {
15+
{ -1, 1, -2, -1, 1, 2, -1, 1, 0 },
16+
{ -1, -1, 0, 0, 0, 0, 1, 1, 2 },
17+
{ 1, -1, 2, 1, -1, -2, 1, -1, 0 },
18+
{ 1, 1, 0, 0, 0, 0, -1, -1, -2 }
19+
};
20+
21+
static int[][] dsy = {
22+
{ 1, 1, 0, 0, 0, 0, -1, -1, -2 },
23+
{ -1, 1, -2, -1, 1, 2, -1, 1, 0 },
24+
{ -1, -1, 0, 0, 0, 0, 1, 1, 2 },
25+
{ 1, -1, 2, 1, -1, -2, 1, -1, 0 }
26+
};
27+
28+
static int[] ratio = {1, 1, 2, 7, 7, 2, 10, 10, 5};
29+
30+
public static void main(String[] args) throws Exception {
31+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
32+
StringTokenizer st;
33+
N = Integer.parseInt(br.readLine());
34+
A = new int[N][N];
35+
36+
for (int i = 0; i < N; i++) {
37+
st = new StringTokenizer(br.readLine());
38+
for (int j = 0; j < N; j++) {
39+
A[i][j] = Integer.parseInt(st.nextToken());
40+
}
41+
}
42+
43+
simulate();
44+
System.out.println(answer);
45+
}
46+
47+
static void simulate() {
48+
int x = N/2;
49+
int y = N/2;
50+
51+
int len = 1;
52+
int dir = 0;
53+
54+
while (true) {
55+
for (int i = 0; i < 2; i++) {
56+
for (int step = 0; step < len; step++) {
57+
58+
x += dx[dir];
59+
y += dy[dir];
60+
61+
spread(x, y, dir);
62+
63+
if (x == 0 && y == 0) return;
64+
}
65+
dir = (dir + 1) % 4;
66+
}
67+
len++;
68+
}
69+
}
70+
71+
static void spread(int x, int y, int dir) {
72+
int sand = A[x][y];
73+
if (sand == 0) {
74+
return;
75+
}
76+
A[x][y] = 0;
77+
78+
int used = 0;
79+
80+
for (int i = 0; i < 9; i++) {
81+
int nx = x + dsx[dir][i];
82+
int ny = y + dsy[dir][i];
83+
84+
int amount = (sand * ratio[i]) / 100;
85+
used += amount;
86+
87+
if (nx < 0 || ny < 0 || nx >= N || ny >= N) {
88+
answer += amount;
89+
} else {
90+
A[nx][ny] += amount;
91+
}
92+
}
93+
94+
int ax = x + dx[dir];
95+
int ay = y + dy[dir];
96+
int remain = sand - used;
97+
98+
if (ax < 0 || ay < 0 || ax >= N || ay >= N) {
99+
answer += remain;
100+
} else {
101+
A[ax][ay] += remain;
102+
}
103+
}
104+
}
105+
```

0 commit comments

Comments
 (0)