麻烦的处理,然后写写写,码农题
#include<iostream> #include<cstdio> #include<cstring> #include<map> #include<queue> #include<string> #include<vector> #include<set> #include<algorithm> #define maxn 1<<29 using namespace std; char a[555][555]; bool c[555][555][4]; bool z[555][555][4]; int xx[4]= {-1,0,1,0}; int yy[4]= {0,-1,0,1}; int n,t; int sx,sy,tx,ty; int r[555][555]; bool vis[555][555]; void solve() { memset(vis,0,sizeof(vis)); queue<int>q; q.push(sx*n+sy); vis[sx][sy]=1; r[sx][sy]=0; while(!q.empty()) { int u=q.front(); q.pop(); int ux=u/n; int uy=u%n; vis[ux][uy]=0; for(int i=0; i<4; i++) { int vx=ux+xx[i]; int vy=uy+yy[i]; if(vx>=n||vx<0||vy>=n||vy<0)continue; if(a[vx][vy]=='#')continue; for(int j=0; j<4; j++) { int tt=r[ux][uy]+j+1; if(z[ux][uy][(tt+3)%4]==0&&c[vx][vy][tt%4]==0) { if(tt<r[vx][vy]) { r[vx][vy]=tt; if(!vis[vx][vy]) { vis[vx][vy]=1; q.push(vx*n+vy); } } } } if(r[vx][vy]>r[ux][uy]+3) { r[vx][vy]=r[ux][uy]+3; if(!vis[vx][vy]) { vis[vx][vy]=1; q.push(vx*n+vy); } } //cout<<vx<<" "<<vy<<" "<<r[vx][vy]<<endl; } } } int main() { int ca=1; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0; i<n; i++)scanf("%s",a[i]); memset(c,0,sizeof(c)); memset(z,0,sizeof(z)); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { r[i][j]=maxn; if(a[i][j]=='M') { sx=i; sy=j; } else if(a[i][j]=='T') { tx=i; ty=j; } else if(a[i][j]=='N') { for(int kk=0; kk<4; kk++) { z[i][j][kk]=1; c[i][j][kk]=1; } if(i-1>=0) { z[i-1][j][0]=1; //c[i-1][j][0]=1; c[i-1][j][1]=1; } if(j-1>=0) { z[i][j-1][3]=1; //c[i][j-1][3]=1; c[i][j-1][0]=1; } if(i+1<n) { z[i+1][j][2]=1; //c[i+1][j][2]=1; c[i+1][j][3]=1; } if(j+1<n) { z[i][j+1][1]=1; //c[i][j+1][3]=1; c[i][j+1][2]=1; } } else if(a[i][j]=='W') { for(int kk=0; kk<4; kk++) { z[i][j][kk]=1; c[i][j][kk]=1; } if(i-1>=0) { z[i-1][j][1]=1; //c[i-1][j][3]=1; c[i-1][j][2]=1; } if(j-1>=0) { z[i][j-1][0]=1; //c[i][j-1][0]=1; c[i][j-1][1]=1; } if(i+1<n) { z[i+1][j][3]=1; //c[i+1][j][1]=1; c[i+1][j][0]=1; } if(j+1<n) { z[i][j+1][2]=1; //c[i][j+1][2]=1; c[i][j+1][3]=1; } } else if(a[i][j]=='S') { for(int kk=0; kk<4; kk++) { z[i][j][kk]=1; c[i][j][kk]=1; } if(i-1>=0) { z[i-1][j][2]=1; //c[i-1][j][2]=1; c[i-1][j][3]=1; } if(j-1>=0) { z[i][j-1][1]=1; //c[i][j-1][3]=1; c[i][j-1][2]=1; } if(i+1<n) { z[i+1][j][0]=1; //c[i+1][j][0]=1; c[i+1][j][1]=1; } if(j+1<n) { z[i][j+1][3]=1; //c[i][j+1][1]=1; c[i][j+1][0]=1; } } else if(a[i][j]=='E') { for(int kk=0; kk<4; kk++) { z[i][j][kk]=1; c[i][j][kk]=1; } if(i-1>=0) { z[i-1][j][3]=1; //c[i-1][j][1]=1; c[i-1][j][0]=1; } if(j-1>=0) { z[i][j-1][2]=1; //c[i][j-1][2]=1; c[i][j-1][3]=1; } if(i+1<n) { z[i+1][j][1]=1; //c[i+1][j][3]=1; c[i+1][j][2]=1; } if(j+1<n) { z[i][j+1][0]=1; //c[i][j+1][0]=1; c[i][j+1][1]=1; } } } } solve(); printf("Case #%d: ",ca++); if(r[tx][ty]==maxn)printf("-1\n"); else printf("%d\n",r[tx][ty]); } return 0; } /* 5 3 MN. NN. ..T 3 MNN NNN T.. */