-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathDH_340211.java
More file actions
116 lines (87 loc) ยท 3.22 KB
/
DH_340211.java
File metadata and controls
116 lines (87 loc) ยท 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import java.util.*;
/*
* ์ถฉ๋์ํ ์ฐพ๊ธฐ
*/
class DH_340211 {
static class Point {
int r, c;
public Point(int r, int c) {
this.r = r;
this.c = c;
}
}
static int[] dr = {0, 0, -1, 1}, dc = {-1, 1, 0, 0};
static Point[][][] checkPoints; // bfs ๊ฒฝ๋ก๋ฅผ ์ญ์ถ์ ํ๊ธฐ ์ํด ์ฌ์ฉ
static HashSet<Integer>[][][] dis; // dis[k][r][c]: k๋ฒ์งธ routes์์ r, c ์ง์ ์ ๊ฐ๋๋ฐ, ๊ฑฐ๋ฆฌ๊ฐ ๋ช์ธ์ง ์ ์ฅ
static boolean[][][] v; // v[k][r][c]: r, c ์ง์ ๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ k์ผ ๋, ๋ฐฉ๋ฌธ ํ๋์ง ํ์ธ
static int result, routeDis;
static int solution(int[][] points, int[][] routes) {
checkPoints = new Point[routes.length][101][101];
dis = new HashSet[routes.length][101][101];
for(int k = 0; k < dis.length; k++) {
for(int r = 0; r < dis[0].length; r++) {
for(int c = 0; c < dis[0][0].length; c++) dis[k][r][c] = new HashSet<Integer>();
}
}
v = new boolean[20_000][101][101];
for(int i = 0; i < routes.length; i++) {
// routes๋ฅผ ๋ฐ๋ผ ๊ฐ ๋, ์ด ๊ธธ์ด๊ฐ ๋ช์ธ์ง ํ์ธํ๊ธฐ ์ํ ๋ณ์
routeDis = 1;
for(int g = 0; g < routes[i].length - 1; g++) {
int[] goal = points[routes[i][g + 1] - 1];
int[] current = points[routes[i][g] - 1];
// bfs๋ ๋ชฉํ ์ง์ ์์๋ถํฐ ์์์ง์ ์ผ๋ก ๋๋ฌํ ์ ์๋๋ก ํด์ผ๋จ
bfs(goal, current, i);
// bfs์ง์ ์ ์ญ์ถ์ ํ๋ฉด์ ๊ฐ์ผ๋ ๊ธธ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ก ๊ฐ๋ฉด์, ์์์ง์ ์ผ๋ก๋ถํฐ ๊ฑฐ๋ฆฌ๊ฐ ๋ช์ธ์ง ์ ์ฅํจ
back(current[0], current[1], goal[0], goal[1], i, routeDis);
}
}
return result;
}
// ๋ชฉํ์ง์ ์์๋ถํฐ ์์์ง์ ์ผ๋ก bfs๋ฅผ ํ ๋ค์
// bfs ๊ฒฝ๋ก๋ฅผ ์ญ์ถ์ ํ๋ฉด์, ์์ ์ง์ ์ผ๋ก๋ถํฐ ๋ชฉํ์ง์ ๊น์ง ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ ๋๋์ง ํ์ธํ๊ณ
// ์์์ง์ ์ผ๋ก๋ถํฐ ๋จ์ด์ง ๊ฑฐ๋ฆฌ๋ฅผ ์ ์ฅํจ
static void back(int r, int c, int er, int ec, int i, int d) {
for(int k = 0; k < dis.length; k++) {
if(k == i) continue;
if(dis[k][r][c].contains(d) && !v[d][r][c]) {
v[d][r][c] = true;
result += 1;
break;
}
}
dis[i][r][c].add(d);
if((r == er && c == ec) || checkPoints[i][r][c] == null) return;
int nr = checkPoints[i][r][c].r;
int nc = checkPoints[i][r][c].c;
routeDis += 1;
back(nr, nc, er, ec, i, d + 1);
}
// bfs๋ฅผ ํตํด ๋ชฉํ์ง์ ์์๋ถํฐ ์์์ง์ ์ผ๋ก ์ต๋จ๊ฑฐ๋ฆฌ ํ์
static void bfs(int[] g, int[] c, int i) {
Deque<Point> q = new ArrayDeque<Point>();
q.add(new Point(g[0], g[1]));
boolean[][] v = new boolean[101][101];
v[g[0]][g[1]] = true;
while(!q.isEmpty()) {
Point current = q.poll();
if(current.r == c[0] && current.c == c[1]) return;
for(int d = 0; d < 4; d++) {
int nr = current.r + dr[d];
int nc = current.c + dc[d];
if(!isValid(nr, nc) || v[nr][nc]) continue;
checkPoints[i][nr][nc] = new Point(current.r, current.c);
q.add(new Point(nr, nc));
v[nr][nc] = true;
}
}
}
static boolean isValid(int r, int c) {
return r > 0 && r < 101 && c > 0 && c < 101;
}
public static void main(String[] args) {
int[][] points = {{1, 1}, {1, 2}, {1, 3}};
int[][] routes = {{2, 1}, {2, 3, 1}};
System.out.println(solution(points, routes));
}
}