Source code for submission s1022

Cockchaf.java

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.text.DecimalFormat;
  4. import java.text.NumberFormat;
  5. import java.util.HashMap;
  6. import java.util.LinkedList;
  7. import java.util.TreeMap;
  8.  
  9.  
  10. class Edge implements Comparable<Edge>
  11. {
  12. public Double t;
  13. public int dx, dy, dz;
  14.  
  15. @Override
  16. public int compareTo(Edge arg0) {
  17. return t.compareTo(arg0.t);
  18. }
  19.  
  20. public Edge(double t, int dx, int dy, int dz) {
  21. this.t = t;
  22. this.dx = dx;
  23. this.dy = dy;
  24. this.dz = dz;
  25. }
  26.  
  27. public double angleTo(Edge e) {
  28. return Math.acos(
  29. (dx * e.dx + dy * e.dy + dz * e.dz)/
  30. (Math.sqrt(dx*dx+dy*dy+dz*dz)*Math.sqrt(e.dx*e.dx+e.dy*e.dy+e.dz*e.dz)
  31. )
  32. );
  33. }
  34. }
  35.  
  36. class Node
  37. {
  38. public int x, y, z;
  39. public LinkedList<Node> nbh;
  40. public boolean end, visited;
  41.  
  42. @Override
  43. public int hashCode()
  44. {
  45. return x ^ y ^ z;
  46. };
  47.  
  48. @Override
  49. public boolean equals(Object arg0)
  50. {
  51. if (arg0 instanceof Node)
  52. {
  53. Node a = (Node)arg0;
  54. return (x == a.x) && (y == a.y) && (z == a.z);
  55. }
  56. return false;
  57. }
  58.  
  59. public Node(int x, int y, int z, boolean end)
  60. {
  61. this.x = x;
  62. this.y = y;
  63. this.z = z;
  64. this.end = end;
  65. visited = false;
  66.  
  67. nbh = new LinkedList<Node>();
  68. }
  69.  
  70. public double distanceTo(Node node)
  71. {
  72. int dx = node.x - x;
  73. int dy = node.y - y;
  74. int dz = node.z - z;
  75. return Math.sqrt(dx*dx + dy*dy + dz*dz);
  76. }
  77.  
  78. public Edge edgeTo(Node node, double t)
  79. {
  80. int dx = node.x - x;
  81. int dy = node.y - y;
  82. int dz = node.z - z;
  83. return new Edge(t, dx, dy, dz);
  84. }
  85. }
  86.  
  87. public class Cockchaf {
  88.  
  89. public static double time(double dist, double speed)
  90. {
  91. return dist / speed;
  92. }
  93.  
  94. /**
  95. * @param args
  96. */
  97. public static void main(String[] args) throws Exception {
  98.  
  99. String s;
  100.  
  101. HashMap<Node, Node> nMap = new HashMap<Node, Node>();
  102. String[] ss;
  103. int n, ssp;
  104. double dist, t, angle, asp;
  105. Edge e, e2;
  106. Node a, b, start;
  107. TreeMap<Edge, Node> pq = new TreeMap<Edge, Node>();
  108.  
  109. while (true)
  110. {
  111. s = br.readLine();
  112. if (s == null) break;
  113.  
  114. ss = s.split(" ");
  115.  
  116. n = Integer.parseInt(ss[0]);
  117. ssp = Integer.parseInt(ss[1]);
  118. asp = Math.PI * Integer.parseInt(ss[2])/180.0;
  119.  
  120. s = br.readLine();
  121. ss = s.split(" ");
  122.  
  123. a = new Node(Integer.parseInt(ss[0]), Integer.parseInt(ss[1]), Integer.parseInt(ss[2]), false);
  124. b = new Node(Integer.parseInt(ss[3]), Integer.parseInt(ss[4]), Integer.parseInt(ss[5]), true);
  125. start = a;
  126.  
  127. nMap.put(a, a);
  128. nMap.put(b, b);
  129.  
  130. for (int i = 0; i < n; i++)
  131. {
  132. s = br.readLine();
  133. ss = s.split(" ");
  134.  
  135. a = new Node(Integer.parseInt(ss[0]), Integer.parseInt(ss[1]), Integer.parseInt(ss[2]), false);
  136. b = new Node(Integer.parseInt(ss[3]), Integer.parseInt(ss[4]), Integer.parseInt(ss[5]), false);
  137.  
  138. if (nMap.containsKey(a)) a = nMap.get(a);
  139. else nMap.put(a, a);
  140.  
  141. if (nMap.containsKey(b)) b = nMap.get(b);
  142. else nMap.put(b, b);
  143.  
  144. a.nbh.addLast(b);
  145. b.nbh.addLast(a);
  146. }
  147.  
  148. a = start;
  149. a.visited = true;
  150. for (Node node : a.nbh)
  151. {
  152. dist = a.distanceTo(node);
  153. pq.put(a.edgeTo(node, time(dist, ssp)), node);
  154. }
  155.  
  156. while (!pq.isEmpty())
  157. {
  158. e = pq.firstKey();
  159. a = pq.remove(e);
  160. t = e.t;
  161.  
  162. if (a.visited) continue;
  163. a.visited = true;
  164.  
  165. if (a.end)
  166. {
  167. DecimalFormat nf = new DecimalFormat("#.####");
  168. System.out.println(nf.format(e.t).replace(',', '.'));
  169. }
  170.  
  171. for (Node node : a.nbh)
  172. {
  173. e2 = a.edgeTo(node, t);
  174. dist = a.distanceTo(node);
  175. angle = e.angleTo(e2);
  176. e2.t += time(angle, asp) + time(dist, ssp);
  177. pq.put(e2, node);
  178. }
  179. }
  180. }
  181. }
  182.  
  183. }
  184.