Guest User

Untitled

a guest
May 24th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.21 KB | None | 0 0
  1. /*
  2. ID: vxsj.fu1
  3. LANG: JAVA
  4. PROG: maze1
  5. */
  6.  
  7. import java.io.*;
  8. import java.util.*;
  9.  
  10. public class maze1 {
  11.  
  12. int[][] map;
  13. ArrayList<Integer>[] graph;
  14.  
  15. int b2(int i) {
  16. int bit = 0;
  17. for (int j = 3; j >= 0; j--) {
  18. int delta = (i / (int) Math.pow(2, j)) * (int) Math.pow(10, j);
  19. if (delta == 0) {
  20. continue;
  21. }
  22. bit += delta;
  23. i -= (int) Math.pow(2, j);
  24. }
  25. return bit;
  26. }
  27.  
  28. boolean checkEast(int a, int b) {
  29. if ((a % 1000) / 100 == 0 && b % 1 == 0) {
  30. return true;
  31. }
  32. return false;
  33. }
  34.  
  35. boolean checkSouth(int a, int b) {
  36. if (a / 1000 == 0 && (b % 100) / 10 == 0) {
  37. return true;
  38. }
  39. return false;
  40. }
  41.  
  42. int min(int a, int b) {
  43. if (a < b) {
  44. return a;
  45. }
  46. return b;
  47. }
  48.  
  49. void run() throws IOException {
  50. BufferedReader f = new BufferedReader(new FileReader("maze1.in"));
  51. PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(
  52. "maze1.out")));
  53. StringTokenizer st = new StringTokenizer(f.readLine());
  54. int w = Integer.parseInt(st.nextToken());
  55. int h = Integer.parseInt(st.nextToken());
  56. map = new int[h][w];
  57. String strLine;
  58. int[] exit = new int[2];
  59. int exitC = 0;
  60. int i1 = 0;
  61. while ((strLine = f.readLine()) != null) {
  62. if (i1 == 0) {
  63. for (int j = 0; j < w; j++) {
  64. if (strLine.charAt(2 * j + 1) == '-') {
  65. map[i1][j] += 2;
  66. } else {
  67. exit[exitC] = w * j + i1;
  68. exitC++;
  69. }
  70. }
  71. } else if (i1 == 2 * h) {
  72. for (int j = 0; j < w; j++) {
  73. if (strLine.charAt(2 * j + 1) == '-') {
  74. map[h - 1][j] += 8;
  75. } else {
  76. exit[exitC] = w * (h - 1) + j;
  77. exitC++;
  78. }
  79. }
  80. } else if (i1 % 2 == 0) {
  81. for (int j = 0; j < w; j++) {
  82. if (strLine.charAt(2 * j + 1) == '-') {
  83. map[i1 / 2 - 1][j] += 8;
  84. map[i1 / 2][j] += 2;
  85. }
  86. }
  87. } else {
  88. if (strLine.charAt(0) == ' ') {
  89. exit[exitC] = i1 / 2 * w;
  90. exitC++;
  91. } else {
  92. map[i1 / 2][0] += 1;
  93. }
  94. for (int j = 1; j <= w - 1; j++) {
  95. if (strLine.charAt(2 * j) == '|') {
  96. map[i1 / 2][j - 1] += 4;
  97. map[i1 / 2][j] += 1;
  98. }
  99. }
  100. if (strLine.charAt(2 * w) == ' ') {
  101. exit[exitC] = i1 / 2 * w + w - 1;
  102. exitC++;
  103. } else {
  104. map[i1 / 2][w - 1] += 4;
  105. }
  106. }
  107. i1++;
  108. }
  109.  
  110. for (int i = 0; i < h; i++) {
  111. for (int j = 0; j < w; j++) {
  112. map[i][j] = b2(map[i][j]);
  113. }
  114. }
  115. graph = new ArrayList[w * h];
  116. for (int p = 0; p < w * h; p++) {
  117. graph[p] = new ArrayList<Integer>();
  118. }
  119. for (int j = 0; j < w; j++) {
  120. for (int p = 0; p < h; p++) {
  121. if (j + 1 != w && checkEast(map[p][j], map[p][j + 1])) {
  122. graph[w * p + j].add(w * p + j + 1);
  123. graph[w * p + j + 1].add(w * p + j);
  124. }
  125. if (p + 1 != h && checkSouth(map[p][j], map[p + 1][j])) {
  126. graph[w * p + j].add(w * p + w + j);
  127. graph[w * p + w + j].add(w * p + j);
  128. }
  129. }
  130. }
  131. // for (int i = 0; i < w * h; i++) {
  132. // System.out.print(i + ": ");
  133. // for (int j = 0; j < graph[i].size(); j++) {
  134. // System.out.print(graph[i].get(j) + " ");
  135. // }
  136. // System.out.println();
  137. // }
  138. int[] dist = new int[w * h], prev = new int[w * h];
  139. LinkedList<Integer> q = new LinkedList<Integer>();
  140. int[] maxD = { 0, 0 };
  141. int max = 0;
  142. for (int s = 0; s < w * h; s++) {
  143. for (int e = 0; e < 2; e++) {
  144. if (exit[e] >= w * h) {
  145. maxD[e] = 10000000;
  146. continue;
  147. }
  148. for (int i = 0; i < prev.length; i++)
  149. prev[i] = -1;
  150. q.add(s);
  151. prev[s] = -2;
  152. dist[s] = 0;
  153. while (!q.isEmpty()) {
  154. int a = q.poll();
  155. for (int b : graph[a]) {
  156. if (prev[b] == -1) {
  157. prev[b] = a;
  158. dist[b] = dist[a] + 1;
  159. q.add(b);
  160. }
  161. }
  162. }
  163. maxD[e] = dist[exit[e]] + 1;
  164. }
  165. if (min(maxD[0], maxD[1]) > max)
  166. {
  167. max = min(maxD[0], maxD[1]);
  168. }
  169. }
  170. // System.out.println(maxD[0] + " " + maxD[1]);
  171. for (int i = 0; i < 2; i++) {
  172. if (maxD[i] == 0) {
  173. maxD[i] += 10000000;
  174. if (i== 1)
  175. {
  176. out.println(min(maxD[0], maxD[1]));
  177. }
  178. }
  179. }
  180. System.out.println(max);
  181. out.close();
  182. System.exit(0);
  183. }
  184.  
  185. public static void main(String[] args) throws IOException {
  186. maze1 prog = new maze1();
  187. prog.run();
  188. }
  189. }
Add Comment
Please, Sign In to add comment