1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 #include<queue>
5 using namespace std;
6 char face[]={'E','S','W','N'},map[505][505];
7 int fac[505][505],vis[505][505][4],n;
8 int xx[]={1,-1,0,0};
9 int yy[]={0,0,1,-1};
10 struct dian{
11 friend bool operator<(dian n1,dian n2)
12 {
13 return(n1.time>n2.time);
14 }
15 int x,y,time;
16 };
17 int bfs(int x1,int y1,int x2,int y2)
18 {
19 priority_queue<dian>q; int i,flag;
20 dian n1,n2;
21 while (!q.empty()) q.pop();
22 n1.x=x1; n1.y=y1; n1.time=0; q.push(n1);
23 vis[x1][y1][0]=1;
24 while (!q.empty())
25 {
26 n1=q.top(); q.pop();
27 if (n1.x==x2&&n1.y==y2) return n1.time;
28 if (vis[n1.x][n1.y][(n1.time+1)%4]==0)
29 {
30 vis[n1.x][n1.y][(n1.time+1)%4]=1;
31 n1.time++; q.push(n1); n1.time--;
32 }
33 for (i=0;i<4;i++)
34 {
35 flag=0;
36 if (n1.x+xx[i]<0||n1.x+xx[i]>=n||n1.y+yy[i]<0||n1.y+yy[i]>=n) continue;
37 if (map[n1.x+xx[i]][n1.y+yy[i]]=='#') continue;
38 if (fac[n1.x][n1.y]!=-1||fac[n1.x+xx[i]][n1.y+yy[i]]!=-1) flag=1;
39 if (n1.x>0&&fac[n1.x-1][n1.y]!=-1&&face[(fac[n1.x-1][n1.y]+n1.time%4)%4]=='S') flag=1;
40 if (n1.x<n-1&&fac[n1.x+1][n1.y]!=-1&&face[(fac[n1.x+1][n1.y]+n1.time%4)%4]=='N') flag=1;
41 if (n1.y>0&&fac[n1.x][n1.y-1]!=-1&&face[(fac[n1.x][n1.y-1]+n1.time%4)%4]=='E') flag=1;
42 if (n1.y<n-1&&fac[n1.x][n1.y+1]!=-1&&face[(fac[n1.x][n1.y+1]+n1.time%4)%4]=='W') flag=1;
43 n2.x=n1.x+xx[i]; n2.y=n1.y+yy[i]; n2.time=n1.time;
44 if (n2.x>0&&fac[n2.x-1][n2.y]!=-1&&face[(fac[n2.x-1][n2.y]+n2.time%4)%4]=='S') flag=1;
45 if (n2.x<n-1&&fac[n2.x+1][n2.y]!=-1&&face[(fac[n2.x+1][n2.y]+n2.time%4)%4]=='N') flag=1;
46 if (n2.y>0&&fac[n2.x][n2.y-1]!=-1&&face[(fac[n2.x][n2.y-1]+n2.time%4)%4]=='E') flag=1;
47 if (n2.y<n-1&&fac[n2.x][n2.y+1]!=-1&&face[(fac[n2.x][n2.y+1]+n2.time%4)%4]=='W') flag=1;
48 if (flag==0) n2.time=n1.time+1;
49 else n2.time=n1.time+3;
50 if (vis[n2.x][n2.y][n2.time%4]==1) continue;
51 vis[n2.x][n2.y][n2.time%4]=1;
52 q.push(n2);
53 }
54 }
55 return -1;
56 }
57 int main()
58 {
59 int T,t,i,j,x1,x2,y1,y2;
60 scanf("%d",&T);
61 for (t=1;t<=T;t++)
62 {
63 scanf("%d",&n);
64 getchar();
65 for (i=0;i<n;i++) scanf("%s",map[i]);
66 memset(vis,0,sizeof(vis));
67 memset(fac,-1,sizeof(fac));
68 for (i=0;i<n;i++)
69 for (j=0;j<n;j++)
70 if (map[i][j]=='M') {x1=i; y1=j; }
71 else if (map[i][j]=='T') {x2=i; y2=j; }
72 else if (map[i][j]=='E') fac[i][j]=0;
73 else if (map[i][j]=='S') fac[i][j]=1;
74 else if (map[i][j]=='W') fac[i][j]=2;
75 else if (map[i][j]=='N') fac[i][j]=3;
76 printf("Case #%d: %d\n",t,bfs(x1,y1,x2,y2));
77 }
78 }
http://acm.hdu.edu.cn/showproblem.php?pid=5040