1 #include <stdio.h>
2 #include <string.h>
3 #include <queue>
4 using namespace std;
5
6 const int MAX = 16;
7 const int x[] = { -1, 0, 1, 0, 0, 0 };
8 const int y[] = { 0, 1, 0, -1, 0, 0 };
9 const int z[] = { 0, 0, 0, 0, -1, 1 };
10 char arr[MAX][MAX][MAX];
11 bool vis[MAX][MAX][MAX];
12
13 struct POINT{
14 int x, y, z, s;
15 };
16
17 int BFS(POINT s, POINT e, int n)
18 {
19 POINT nx, t;
20 memset(vis, 0, sizeof(vis)); vis[s.z][s.y][s.x] = true;
21 queue<POINT> qu;
22 qu.push(s);
23 while(!qu.empty())
24 {
25 nx = qu.front(); qu.pop();
26 if(nx.x == e.x && nx.y == e.y && nx.z == e.z)
27 {
28 return nx.s;
29 }
30 for(int i = 0; i < 6; i++)
31 {
32 t.x = nx.x + x[i]; t.y = nx.y + y[i]; t.z = nx.z + z[i];
33 if((t.x >= 0 && t.x < n) && (t.y >= 0 && t.y < n) && (t.z >= 0 && t.z < n) && !vis[t.z][t.y][t.x] && arr[t.z][t.y][t.x] == ‘O‘)
34 {
35 vis[t.z][t.y][t.x] = true;
36 t.s = nx.s + 1;
37 qu.push(t);
38 }
39 }
40 }
41 return -1;
42 }
43
44 int main()
45 {
46 #ifdef CDZSC_OFFLINE
47 freopen("in.txt", "r", stdin);
48 freopen("out.txt", "w", stdout);
49 #endif
50 int n, ans;
51 char str[32];
52 POINT s, t;
53 while(~scanf("%s", str) && str[0] == ‘S‘)
54 {
55 scanf("%d", &n);
56 memset(arr, 0, sizeof(arr));
57 for(int i = 0; i < n; i++)
58 {
59 for(int j = 0; j < n; j++)
60 {
61 scanf("%s", arr[i][j]);
62 }
63 }
64 scanf("%d%d%d%d%d%d", &s.x, &s.y, &s.z, &t.x, &t.y, &t.z); s.s = 0;
65 ans = BFS(s, t, n);
66 if(ans == -1)
67 {
68 printf("NO ROUTE\n");
69 }
70 else
71 {
72 printf("%d %d\n", n, ans);
73 }
74 scanf("%s", str);
75 }
76 return 0;
77 }