Source code for submission s1348

Go to diff to previous submission

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. pq.clear();
  114. nMap.clear();
  115.  
  116. ss = s.split(" ");
  117.  
  118. n = Integer.parseInt(ss[0]);
  119. ssp = Integer.parseInt(ss[1]);
  120. asp = Math.PI * Integer.parseInt(ss[2])/180.0;
  121.  
  122. s = br.readLine();
  123. ss = s.split(" ");
  124.  
  125. a = new Node(Integer.parseInt(ss[0]), Integer.parseInt(ss[1]), Integer.parseInt(ss[2]), false);
  126. b = new Node(Integer.parseInt(ss[3]), Integer.parseInt(ss[4]), Integer.parseInt(ss[5]), true);
  127. start = a;
  128.  
  129. nMap.put(a, a);
  130. nMap.put(b, b);
  131.  
  132. for (int i = 0; i < n; i++)
  133. {
  134. s = br.readLine();
  135. ss = s.split(" ");
  136.  
  137. a = new Node(Integer.parseInt(ss[0]), Integer.parseInt(ss[1]), Integer.parseInt(ss[2]), false);
  138. b = new Node(Integer.parseInt(ss[3]), Integer.parseInt(ss[4]), Integer.parseInt(ss[5]), false);
  139.  
  140. if (nMap.containsKey(a)) a = nMap.get(a);
  141. else nMap.put(a, a);
  142.  
  143. if (nMap.containsKey(b)) b = nMap.get(b);
  144. else nMap.put(b, b);
  145.  
  146. a.nbh.addLast(b);
  147. b.nbh.addLast(a);
  148. }
  149.  
  150. a = start;
  151. a.visited = true;
  152. for (Node node : a.nbh)
  153. {
  154. dist = a.distanceTo(node);
  155. pq.put(a.edgeTo(node, time(dist, ssp)), node);
  156. }
  157.  
  158. while (!pq.isEmpty())
  159. {
  160. e = pq.firstKey();
  161. a = pq.remove(e);
  162. t = e.t;
  163.  
  164. if (a.visited) continue;
  165. a.visited = true;
  166.  
  167. if (a.end)
  168. {
  169. DecimalFormat nf = new DecimalFormat("#.0000");
  170. System.out.println(nf.format(e.t).replace(',', '.'));
  171. break;
  172. }
  173.  
  174. for (Node node : a.nbh)
  175. {
  176. e2 = a.edgeTo(node, t);
  177. dist = a.distanceTo(node);
  178. angle = e.angleTo(e2);
  179. e2.t += time(angle, asp) + time(dist, ssp);
  180. pq.put(e2, node);
  181. }
  182. }
  183. }
  184. }
  185.  
  186. }
  187.  

Diff to submission s1342

Cockchaf.java

--- c4.s1342.cteam112.cockchaf.java.0.Cockchaf.java
+++ c4.s1348.cteam112.cockchaf.java.0.Cockchaf.java
@@ -81,5 +81,5 @@
                 int dy = node.y - y;
                 int dz = node.z - z;
-                return new Edge(t, -dx, -dy, -dz);
+                return new Edge(t, dx, dy, dz);
         }
 }