留个纪念吧
1
import
java.io.
*
;
2 import java.util. * ;
3
4 /*
5 LANG: JAVA
6 TASK: maze1
7 */
8 public class maze1 {
9
10 /**
11 * @param args
12 * @throws IOException
13 */
14 public static void main(String[] args) throws IOException {
15 // TODO Auto-generated method stub
16 BufferedReader f = new BufferedReader( new FileReader( " maze1.in " ));
17 PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter( " maze1.out " )));
18
19 StringTokenizer st = new StringTokenizer(f.readLine());
20 int W = Integer.parseInt(st.nextToken());
21 int H = Integer.parseInt(st.nextToken());
22
23 char [][] maze = new char [ 2 * H + 1 ][ 2 * W + 1 ];
24
25 for ( int i = 0 ; i < 2 * H + 1 ; i ++ )
26 {
27 String temp = f.readLine();
28 maze[i] = temp.toCharArray();
29 }
30
31 byte [][] D = new byte [W * H][W * H];
32
33 for ( int i = 0 ; i < W * H; i ++ )
34 for ( int j = 0 ; j < W * H; j ++ )
35 {
36 if (i != j)
37 D[i][j] = - 1 ;
38 else
39 D[i][j] = 0 ;
40 }
41
42 for ( int i = 0 ; i < H; i ++ )
43 for ( int j = 0 ; j < W; j ++ )
44 {
45 int x = 1 + 2 * j;
46 int y = 1 + 2 * i;
47 int current = i * W + j;
48
49 if (i - 1 >= 0 )
50 {
51 if (maze[y - 1 ][x] != ' - ' )
52 {
53 D[(i - 1 ) * W + j][current] = 1 ;
54 D[current][(i - 1 ) * W + j] = 1 ;
55 }
56 }
57
58 if (i + 1 < H)
59 {
60 if (maze[y + 1 ][x] != ' - ' )
61 {
62 D[(i + 1 ) * W + j][current] = 1 ;
63 D[current][(i + 1 ) * W + j] = 1 ;
64 }
65 }
66
67 if (j - 1 >= 0 )
68 {
69 if (maze[y][x - 1 ] != ' | ' )
70 {
71 D[i * W + j - 1 ][current] = 1 ;
72 D[current][i * W + j - 1 ] = 1 ;
73 }
74 }
75
76 if (j + 1 < W)
77 {
78 if (maze[y][x + 1 ] != ' | ' )
79 {
80 D[i * W + j + 1 ][current] = 1 ;
81 D[current][i * W + j + 1 ] = 1 ;
82 }
83 }
84
85 }
86
87 int exit1 = - 1 ;
88 int exit2 = - 1 ;
89
90 for ( int i = 0 ; i < W; i ++ )
91 {
92 int x = 1 + 2 * i;
93 int y1 = 0 ;
94 int y2 = 2 * H;
95
96 if (maze[y1][x] != ' - ' )
97 {
98 if (exit1 == - 1 )
99 exit1 = i;
100 else
101 exit2 = i;
102 }
103 if (maze[y2][x] != ' - ' )
104 {
105 if (exit1 == - 1 )
106 exit1 = W * (H - 1 ) + i;
107 else
108 exit2 = W * (H - 1 ) + i;
109 }
110 }
111
112 for ( int j = 0 ; j < H; j ++ )
113 {
114 int y = 1 + 2 * j;
115 int x1 = 0 ;
116 int x2 = 2 * W;
117
118 if (maze[y][x1] != ' | ' )
119 {
120 if (exit1 == - 1 )
121 exit1 = j * W;
122 else
123 exit2 = j * W;
124 }
125
126 if (maze[y][x2] != ' | ' )
127 {
128 if (exit1 == - 1 )
129 exit1 = j * W + W - 1 ;
130 else
131 exit2 = j * W + W - 1 ;
132 }
133 }
134
135
136
137 int max = - 1 ;
138
139
140 int [] distance = new int [H * W];
141 boolean [] visited = new boolean [H * W];
142
143 int [] distance1 = new int [H * W];
144 boolean [] visited1 = new boolean [H * W];
145
146 for ( int i = 0 ; i < H * W; i ++ )
147 {
148 if (D[exit1][i] !=- 1 )
149 distance[i] = D[exit1][i];
150 else
151 distance[i] = 100000 ;
152
153 if (D[exit2][i] !=- 1 )
154 distance1[i] = D[exit2][i];
155 else
156 distance1[i] = 100000 ;
157 }
158
159
160 visited1[exit2] = true ;
161
162 visited[exit1] = true ;
163
164 int nodevisited = 1 ;
165
166 while (nodevisited < H * W - 1 )
167 {
168 int min = 1000000 ;
169 int i = 0 ;
170 for ( int j = 0 ; j < H * W; j ++ )
171 {
172 if (visited[j] == false )
173 {
174 if (j != exit1 && distance[j] < min)
175 {
176 min = distance[j];
177 i = j;
178 }
179
180 }
181 }
182 visited[i] = true ;
183 nodevisited ++ ;
184
185 for ( int j = 0 ; j < H * W; j ++ )
186 if (j != i && D[j][i] != - 1 )
187 {
188 if (distance[i] + D[i][j] < distance[j])
189 distance[j] = distance[i] + D[i][j];
190
191 }
192 }
193
194
195 nodevisited = 1 ;
196 while (nodevisited < H * W - 1 )
197 {
198 int min = 1000000 ;
199 int i = 0 ;
200 for ( int j = 0 ; j < H * W; j ++ )
201 {
202 if (visited1[j] == false )
203 {
204 if (j != exit2 && distance1[j] < min)
205 {
206 min = distance1[j];
207 i = j;
208 }
209
210 }
211 }
212 visited1[i] = true ;
213 nodevisited ++ ;
214
215 for ( int j = 0 ; j < H * W; j ++ )
216 if (j != i && D[j][i] != - 1 )
217 {
218 if (distance1[i] + D[i][j] < distance1[j])
219 distance1[j] = distance1[i] + D[i][j];
220
221 }
222 }
223
224
225
226
227
228
229 for ( int i = 0 ; i < H * W; i ++ )
230 {
231 if (distance[i] > distance1[i])
232 {
233 if (distance1[i] > max)
234 max = distance1[i];
235 }
236 else
237 {
238 if (distance[i] > max)
239 max = distance[i];
240 }
241 }
242
243 out.println(max + 1 );
244 out.close();
245 System.exit( 0 );
246 }
247
248 }
249
2 import java.util. * ;
3
4 /*
5 LANG: JAVA
6 TASK: maze1
7 */
8 public class maze1 {
9
10 /**
11 * @param args
12 * @throws IOException
13 */
14 public static void main(String[] args) throws IOException {
15 // TODO Auto-generated method stub
16 BufferedReader f = new BufferedReader( new FileReader( " maze1.in " ));
17 PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter( " maze1.out " )));
18
19 StringTokenizer st = new StringTokenizer(f.readLine());
20 int W = Integer.parseInt(st.nextToken());
21 int H = Integer.parseInt(st.nextToken());
22
23 char [][] maze = new char [ 2 * H + 1 ][ 2 * W + 1 ];
24
25 for ( int i = 0 ; i < 2 * H + 1 ; i ++ )
26 {
27 String temp = f.readLine();
28 maze[i] = temp.toCharArray();
29 }
30
31 byte [][] D = new byte [W * H][W * H];
32
33 for ( int i = 0 ; i < W * H; i ++ )
34 for ( int j = 0 ; j < W * H; j ++ )
35 {
36 if (i != j)
37 D[i][j] = - 1 ;
38 else
39 D[i][j] = 0 ;
40 }
41
42 for ( int i = 0 ; i < H; i ++ )
43 for ( int j = 0 ; j < W; j ++ )
44 {
45 int x = 1 + 2 * j;
46 int y = 1 + 2 * i;
47 int current = i * W + j;
48
49 if (i - 1 >= 0 )
50 {
51 if (maze[y - 1 ][x] != ' - ' )
52 {
53 D[(i - 1 ) * W + j][current] = 1 ;
54 D[current][(i - 1 ) * W + j] = 1 ;
55 }
56 }
57
58 if (i + 1 < H)
59 {
60 if (maze[y + 1 ][x] != ' - ' )
61 {
62 D[(i + 1 ) * W + j][current] = 1 ;
63 D[current][(i + 1 ) * W + j] = 1 ;
64 }
65 }
66
67 if (j - 1 >= 0 )
68 {
69 if (maze[y][x - 1 ] != ' | ' )
70 {
71 D[i * W + j - 1 ][current] = 1 ;
72 D[current][i * W + j - 1 ] = 1 ;
73 }
74 }
75
76 if (j + 1 < W)
77 {
78 if (maze[y][x + 1 ] != ' | ' )
79 {
80 D[i * W + j + 1 ][current] = 1 ;
81 D[current][i * W + j + 1 ] = 1 ;
82 }
83 }
84
85 }
86
87 int exit1 = - 1 ;
88 int exit2 = - 1 ;
89
90 for ( int i = 0 ; i < W; i ++ )
91 {
92 int x = 1 + 2 * i;
93 int y1 = 0 ;
94 int y2 = 2 * H;
95
96 if (maze[y1][x] != ' - ' )
97 {
98 if (exit1 == - 1 )
99 exit1 = i;
100 else
101 exit2 = i;
102 }
103 if (maze[y2][x] != ' - ' )
104 {
105 if (exit1 == - 1 )
106 exit1 = W * (H - 1 ) + i;
107 else
108 exit2 = W * (H - 1 ) + i;
109 }
110 }
111
112 for ( int j = 0 ; j < H; j ++ )
113 {
114 int y = 1 + 2 * j;
115 int x1 = 0 ;
116 int x2 = 2 * W;
117
118 if (maze[y][x1] != ' | ' )
119 {
120 if (exit1 == - 1 )
121 exit1 = j * W;
122 else
123 exit2 = j * W;
124 }
125
126 if (maze[y][x2] != ' | ' )
127 {
128 if (exit1 == - 1 )
129 exit1 = j * W + W - 1 ;
130 else
131 exit2 = j * W + W - 1 ;
132 }
133 }
134
135
136
137 int max = - 1 ;
138
139
140 int [] distance = new int [H * W];
141 boolean [] visited = new boolean [H * W];
142
143 int [] distance1 = new int [H * W];
144 boolean [] visited1 = new boolean [H * W];
145
146 for ( int i = 0 ; i < H * W; i ++ )
147 {
148 if (D[exit1][i] !=- 1 )
149 distance[i] = D[exit1][i];
150 else
151 distance[i] = 100000 ;
152
153 if (D[exit2][i] !=- 1 )
154 distance1[i] = D[exit2][i];
155 else
156 distance1[i] = 100000 ;
157 }
158
159
160 visited1[exit2] = true ;
161
162 visited[exit1] = true ;
163
164 int nodevisited = 1 ;
165
166 while (nodevisited < H * W - 1 )
167 {
168 int min = 1000000 ;
169 int i = 0 ;
170 for ( int j = 0 ; j < H * W; j ++ )
171 {
172 if (visited[j] == false )
173 {
174 if (j != exit1 && distance[j] < min)
175 {
176 min = distance[j];
177 i = j;
178 }
179
180 }
181 }
182 visited[i] = true ;
183 nodevisited ++ ;
184
185 for ( int j = 0 ; j < H * W; j ++ )
186 if (j != i && D[j][i] != - 1 )
187 {
188 if (distance[i] + D[i][j] < distance[j])
189 distance[j] = distance[i] + D[i][j];
190
191 }
192 }
193
194
195 nodevisited = 1 ;
196 while (nodevisited < H * W - 1 )
197 {
198 int min = 1000000 ;
199 int i = 0 ;
200 for ( int j = 0 ; j < H * W; j ++ )
201 {
202 if (visited1[j] == false )
203 {
204 if (j != exit2 && distance1[j] < min)
205 {
206 min = distance1[j];
207 i = j;
208 }
209
210 }
211 }
212 visited1[i] = true ;
213 nodevisited ++ ;
214
215 for ( int j = 0 ; j < H * W; j ++ )
216 if (j != i && D[j][i] != - 1 )
217 {
218 if (distance1[i] + D[i][j] < distance1[j])
219 distance1[j] = distance1[i] + D[i][j];
220
221 }
222 }
223
224
225
226
227
228
229 for ( int i = 0 ; i < H * W; i ++ )
230 {
231 if (distance[i] > distance1[i])
232 {
233 if (distance1[i] > max)
234 max = distance1[i];
235 }
236 else
237 {
238 if (distance[i] > max)
239 max = distance[i];
240 }
241 }
242
243 out.println(max + 1 );
244 out.close();
245 System.exit( 0 );
246 }
247
248 }
249