1 #include<stdio.h>
  2 #include<string.h>
  3 const int N = 30;
  4 char map[N][N];
  5 struct node {
  6     int dir, x, y, time, color;
  7 }q[N * N * 5 * 4 * 10], cur, next, start, end;
  8 int m, n;
  9 bool judge(node cur) {
 10     if(cur.x >=0 && cur. x < m && cur.y >=0 && cur.y < n)
 11         return true;
 12     else
 13         return false;
 14 }
 15 bool v[N][N][5][4];
 16 int bfs(node start) {
 17     memset(v, 0, sizeof(v));
 18     v[start.x][start.y][start.color][start.dir] = 1;
 19     int rear = -1, front = 0;
 20     q[++rear] = start;
 21     while(front <= rear) {
 22         cur = q[front++];
 23         //printf("x = %d y = %d color = %d dir = %d time = %d\n", cur.x, cur.y, cur.color, cur.dir, cur.time);
 24         if(map[cur.x][cur.y] == 'T' && cur.color == 0)
 25             return cur.time;
 26         next = cur; next.time = cur.time + 1;
 27         next.dir = (cur.dir + 1) % 4;
 28         if(!v[next.x][next.y][next.color][next.dir]) {
 29             v[next.x][next.y][next.color][next.dir] = 1;
 30             q[++rear] = next;
 31         }
 32         next.dir = (cur.dir + 3) % 4;
 33         if(!v[next.x][next.y][next.color][next.dir]) {
 34             v[next.x][next.y][next.color][next.dir] = 1;
 35             q[++rear] = next;
 36         }
 37         if(cur.dir == 0) {
 38             next.x = cur.x - 1;
 39             next.color = (cur.color + 1) % 5;
 40             next.dir = cur.dir;
 41             if(judge(next) && !v[next.x][next.y][next.color][next.dir] && map[next.x][next.y] != '#') {
 42             v[next.x][next.y][next.color][next.dir] = 1;
 43             q[++rear] = next;
 44             }
 45         }
 46         else if(cur.dir == 1) {
 47             next.y = cur.y + 1;
 48             next.color = (cur.color + 1) % 5;
 49             next.dir = cur.dir;
 50             if(judge(next) && !v[next.x][next.y][next.color][next.dir] && map[next.x][next.y] != '#') {
 51                 v[next.x][next.y][next.color][next.dir] = 1;
 52                 q[++rear] = next;
 53             }
 54         }
 55         else if(cur.dir == 2) {
 56             next.x = cur.x + 1;
 57             next.color = (cur.color + 1) % 5;
 58             next.dir = cur.dir;
 59             if(judge(next) && !v[next.x][next.y][next.color][next.dir] && map[next.x][next.y] != '#') {
 60                 v[next.x][next.y][next.color][next.dir] = 1;
 61                 q[++rear] = next;
 62             }
 63         }
 64         else {
 65             next.y = cur.y - 1;
 66             next.color = (cur.color + 1) % 5;
 67             next.dir = cur.dir;
 68             if(judge(next) && !v[next.x][next.y][next.color][next.dir] && map[next.x][next.y] != '#') {
 69                 v[next.x][next.y][next.color][next.dir] = 1;
 70                 q[++rear] = next;
 71             }
 72         }
 73     }
 74     return -1;
 75 }
 76 int main() {
 77     int ca = 1;
 78     while(scanf("%d%d", &m, &n), m||n) {
 79         for(int i = 0; i < m; ++i) {
 80             scanf("%s", map[i]);
 81             for(int j = 0; j < n; ++j) {
 82                 if(map[i][j] == 'S') {
 83                     start.x = i;
 84                     start.y = j;
 85                     start.dir = 0;
 86                     start.color = 0;
 87                     start.time = 0;
 88                 }
 89             }
 90         }
 91         int ans = bfs(start);
 92         if(ca != 1) printf("\n");
 93         printf("Case #%d\n", ca++);
 94         if(ans == -1)
 95             printf("destination not reachable\n");
 96         else
 97             printf("minimum time = %d sec\n", ans);
 98     }
 99     return 0;
100 }