Skip to content

Commit 888a134

Browse files
authored
Merge pull request #1711 from AlgorithmWithGod/Ukj0ng
[20251219] BOJ / G3 / 소가 길을 건너간 이유 6 / 한종욱
2 parents 94455c6 + 78f40ee commit 888a134

File tree

1 file changed

+112
-0
lines changed

1 file changed

+112
-0
lines changed
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
```
2+
import java.io.*;
3+
import java.util.*;
4+
5+
public class Main {
6+
private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
8+
private static final int[] dx = {1, 0, -1, 0};
9+
private static final int[] dy = {0, 1, 0, -1};
10+
private static boolean[][] map, visited;
11+
private static boolean[][][] block;
12+
private static int[][] cows;
13+
private static int N, K, R, answer;
14+
15+
public static void main(String[] args) throws IOException {
16+
init();
17+
18+
int temp = 0;
19+
for (int i = 0; i < K; i++) {
20+
temp += BFS(cows[i][0], cows[i][1]);
21+
map[cows[i][0]][cows[i][1]] = false;
22+
}
23+
24+
bw.write(answer-temp + "\n");
25+
bw.flush();
26+
bw.close();
27+
br.close();
28+
}
29+
30+
private static void init() throws IOException {
31+
StringTokenizer st = new StringTokenizer(br.readLine());
32+
33+
N = Integer.parseInt(st.nextToken());
34+
K = Integer.parseInt(st.nextToken());
35+
R = Integer.parseInt(st.nextToken());
36+
answer = K*(K-1)/2;
37+
38+
map = new boolean[N+1][N+1];
39+
visited = new boolean[N+1][N+1];
40+
block = new boolean[N+1][N+1][4];
41+
cows = new int[K][2];
42+
43+
for (int i = 0; i < R; i++) {
44+
st = new StringTokenizer(br.readLine());
45+
int r1 = Integer.parseInt(st.nextToken());
46+
int c1 = Integer.parseInt(st.nextToken());
47+
int r2 = Integer.parseInt(st.nextToken());
48+
int c2 = Integer.parseInt(st.nextToken());
49+
50+
if (r1-r2 == 0) {
51+
if (c1-c2 == 1) {
52+
block[r1][c1][3] = true;
53+
block[r2][c2][1] = true;
54+
} else {
55+
block[r1][c1][1] = true;
56+
block[r2][c2][3] = true;
57+
}
58+
} else {
59+
if (r1-r2 == 1) {
60+
block[r1][c1][2] = true;
61+
block[r2][c2][0] = true;
62+
} else {
63+
block[r1][c1][0] = true;
64+
block[r2][c2][2] = true;
65+
}
66+
}
67+
}
68+
69+
for (int i = 0; i < K; i++) {
70+
st = new StringTokenizer(br.readLine());
71+
int r = Integer.parseInt(st.nextToken());
72+
int c = Integer.parseInt(st.nextToken());
73+
74+
map[r][c] = true;
75+
cows[i][0] = r;
76+
cows[i][1] = c;
77+
}
78+
}
79+
80+
private static int BFS(int x, int y) {
81+
Queue<int[]> q = new ArrayDeque<>();
82+
for (int i = 1; i <= N; i++) {
83+
Arrays.fill(visited[i], false);
84+
}
85+
visited[x][y] = true;
86+
int count = 0;
87+
q.add(new int[]{x, y});
88+
89+
while (!q.isEmpty()) {
90+
int[] current = q.poll();
91+
int cx = current[0];
92+
int cy = current[1];
93+
94+
for (int i = 0; i < 4; i++) {
95+
int nx = cx + dx[i];
96+
int ny = cy + dy[i];
97+
98+
if (OOB(nx, ny) || block[cx][cy][i] || visited[nx][ny]) continue;
99+
if (map[nx][ny]) count++;
100+
visited[nx][ny] = true;
101+
q.add(new int[] {nx, ny});
102+
}
103+
}
104+
105+
return count;
106+
}
107+
108+
private static boolean OOB(int nx, int ny) {
109+
return nx < 1 || nx > N || ny < 1 || ny > N;
110+
}
111+
}
112+
```

0 commit comments

Comments
 (0)