#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=30;
struct node{
int x,y,c,dr,s;
};
char str[maxn];
bool p[maxn][maxn][5][4],a[maxn][maxn];
struct node q[maxn*maxn*4*5];
void din(int i,int x1,int y1,int c1,int dr1,int s1){
q[i].x=x1;q[i].y=y1;q[i].s=s1;q[i].c=c1;q[i].dr=dr1;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("uva10047.in","r",stdin);
freopen("uva10047.out","w",stdout);
#endif
int i,j,k,k1,m,n;
int xs,ys,xt,yt,e,T=0;
int f,l,u,v,w;
while(1){
T++;
memset(p,0,sizeof(p));
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
if(n*m==0)break;
if(T>1)puts("");
getchar();
for(i=1;i<=n;i++){
gets(str);
for(j=0;j<m;j++){
if(str[j]!='#')
a[i][j+1]=1;
if(str[j]=='S'){
xs=i;ys=j+1;
}
if(str[j]=='T'){
xt=i;yt=j+1;
}
}
}
f=0;l=1;
din(1,xs,ys,0,0,0);
p[xs][ys][0][0]=1;
int flag=0,ans;
int col,dre;
while(f<l){
f++;
u=q[f].x;v=q[f].y;w=q[f].s;col=q[f].c;dre=q[f].dr;
if(!p[u][v][col][(dre+1)%4]){
din(++l,u,v,col,(dre+1)%4,w+1);
p[u][v][col][(dre+1)%4]=1;
}
if(!p[u][v][col][(dre+3)%4]){
din(++l,u,v,col,(dre+3)%4,w+1);
p[u][v][col][(dre+3)%4]=1;
}
if(dre==0 && a[u-1][v] && !p[u-1][v][(col+1)%5][dre]){
din(++l,u-1,v,(col+1)%5,dre,w+1);
p[u-1][v][(col+1)%5][dre]=1;
if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
}
if(dre==1 && a[u][v+1] && !p[u][v+1][(col+1)%5][dre]){
din(++l,u,v+1,(col+1)%5,dre,w+1);
p[u][v+1][(col+1)%5][dre]=1;
if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
}
if(dre==2 && a[u+1][v] && !p[u+1][v][(col+1)%5][dre]){
din(++l,u+1,v,(col+1)%5,dre,w+1);
p[u+1][v][(col+1)%5][dre]=1;
if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
}
if(dre==3 && a[u][v-1] && !p[u][v-1][(col+1)%5][dre]){
din(++l,u,v-1,(col+1)%5,dre,w+1);
p[u][v-1][(col+1)%5][dre]=1;
if(q[l].x==xt && q[l].y==yt && q[l].c==0){flag=1;ans=w+1;break;}
}
}
if(!flag)
printf("Case #%d\ndestination not reachable\n",T);
else
printf("Case #%d\nminimum time = %d sec\n",T,ans);
}
return 0;
}
图论基础UVA10047
最新推荐文章于 2018-01-30 20:46:53 发布