-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlasers.java
More file actions
106 lines (80 loc) · 2.61 KB
/
Copy pathlasers.java
File metadata and controls
106 lines (80 loc) · 2.61 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
import java.util.*;
import java.io.*;
public class lasers {
public static int n;
public static int[][] pts;
public static HashSet[] xLinks;
public static HashSet[] yLinks;
public static void main(String[] args) throws Exception {
BufferedReader stdin = new BufferedReader(new FileReader("lasers.in"));
StringTokenizer tok = new StringTokenizer(stdin.readLine());
n = Integer.parseInt(tok.nextToken());
pts = new int[n+2][2];
TreeSet<Integer> xVals = new TreeSet<Integer>();
TreeSet<Integer> yVals = new TreeSet<Integer>();
for (int i=0; i<2; i++) {
pts[i][0] = Integer.parseInt(tok.nextToken());
pts[i][1] = Integer.parseInt(tok.nextToken());
xVals.add(pts[i][0]);
yVals.add(pts[i][1]);
}
for (int i=2; i<n+2; i++) {
tok = new StringTokenizer(stdin.readLine());
pts[i][0] = Integer.parseInt(tok.nextToken());
pts[i][1] = Integer.parseInt(tok.nextToken());
xVals.add(pts[i][0]);
yVals.add(pts[i][1]);
}
HashMap<Integer,Integer> xMap = makeMap(xVals);
HashMap<Integer,Integer> yMap = makeMap(yVals);
for (int i=0; i<n+2; i++) {
pts[i][0] = xMap.get(pts[i][0]);
pts[i][1] = yMap.get(pts[i][1]);
}
xLinks = new HashSet[xMap.size()];
for (int i=0; i<xLinks.length; i++) xLinks[i] = new HashSet<Integer>();
yLinks = new HashSet[yMap.size()];
for (int i=0; i<yLinks.length; i++) yLinks[i] = new HashSet<Integer>();
for (int i=0; i<n+2; i++) {
xLinks[pts[i][0]].add(pts[i][1]);
yLinks[pts[i][1]].add(pts[i][0]);
}
PrintWriter out = new PrintWriter(new FileWriter("lasers.out"));
out.println(bfs(0,1)-1);
out.close();
stdin.close();
}
public static int bfs(int s, int e) {
if (pts[s][0] == pts[e][0] || pts[s][1] == pts[e][1]) return 1;
int[][] dist = new int[2][];
dist[0] = new int[xLinks.length];
dist[1] = new int[yLinks.length];
Arrays.fill(dist[0], -1);
Arrays.fill(dist[1], -1);
dist[0][pts[s][0]] = 1;
dist[1][pts[s][1]] = 1;
LinkedList<Integer> q = new LinkedList<Integer>();
q.offer(pts[s][0] << 1);
q.offer((pts[s][1] << 1) + 1);
while (q.size() > 0) {
int cur = q.poll();
int xy = cur&1;
int val = cur >> 1;
if (val == pts[e][xy]) return dist[xy][val];
HashSet[] list = xy == 0 ? xLinks : yLinks;
for (Integer item : (HashSet<Integer>)list[val]) {
if (dist[1-xy][item] == -1) {
dist[1-xy][item] = dist[xy][val] + 1;
q.offer( (item<<1) + (1-xy));
}
}
}
return -1;
}
public static HashMap<Integer,Integer> makeMap(TreeSet<Integer> ts) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for (int i=0; ts.size()>0; i++)
map.put(ts.pollFirst(), i);
return map;
}
}