好复杂的样子。。其实就是纸老虎,多了方向、颜色两个状态罢了,依旧是bfs。
更新的时候注意处理好就行了,vis[][][][]要勇敢地开。
不过这个代码交了十几遍的submission error,手都软了
代码应该是没有问题,也可以参考http://blog.****.net/wjjayo/article/details/5809911
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; const int MAXN=; struct P{
int x,y,d,c;
int bfn;
P(){}
P(int _x,int _y,int _d,int _c,int _bfn):x(_x),y(_y),d(_d),c(_c),bfn(_bfn){}
}que[MAXN*MAXN*]; char mp[MAXN][MAXN],n,m;
int vis[MAXN][MAXN][][],tot;
int dis[][]={-,,,-,,,,};
int ex,ey; void bfs(int a,int b)
{
int l,r;
l=r=;
que[r].x=a;
que[r].y=b;
que[r].d=;
que[r].c=;
que[r++].bfn=;
vis[a][b][][]=;
while(l<r)
{
int x=que[l].x;
int y=que[l].y;
int d=que[l].d;
int c=que[l].c;
int bfn=que[l++].bfn; if(x==ex&&y==ey&&c==)
break; int dx=dis[d][];
int dy=dis[d][];
if(!vis[x+dx][y+dy][d][(c+)%]&&mp[x+dx][y+dy]!='#'&&x+dx>=&&x+dx<n&&y+dy>=&&y+dy<m){
que[r++]=P(x+dx,y+dy,d,(c+)%,bfn+);
vis[x+dx][y+dy][d][(c+)%]=;
}
if(!vis[x][y][(d+-)%][c]){
que[r++]=P(x,y,(d+-)%,c,bfn+);
vis[x][y][(d+-)%][c]=;
}
if(!vis[x][y][(d+)%][c]){
que[r++]=P(x,y,(d+)%,c,bfn+);
vis[x][y][(d+)%][c]=;
}
}
if(l<r)
printf("Case #%d\nminimum time = %d sec\n",++tot,que[l-].bfn);
else
printf("Case #%d\ndestination not reachable\n",++tot);
} int main()
{
int sx,sy;
int i,j;
tot=;
while(scanf("%d%d",&n,&m)!=EOF)
{ if(tot)
printf("\n");
if(!n&&!m)
return ;
for(i=;i<n;i++)
{
getchar();
for(j=;j<m;j++)
{
scanf("%c",&mp[i][j]);
if(mp[i][j]=='S'){
sx=i;sy=j;
}
if(mp[i][j]=='T'){
ex=i;ey=j;
}
}
}
bfs(sx,sy);
}
return ;
}