uva 10047 独轮车



#include<bits/stdc++.h>
using namespace std;

struct P{
    int x,y,d,c,t;
};
char M[30][30];
bool vis[30][30][4][5];
int main()
{
    int m,n,i,j,T=1,flag=0;
    while(~scanf("%d%d",&m,&n)&&(m+n))
    {
        memset(vis,0,sizeof(vis));
    for(i=0;i<m;++i)
        scanf("%s",M[i]);
        if(flag) puts("");
    else {flag=1;}
    printf("Case #%d\n",T++);

    queue<P>q;
    P e;
    for(i=0;i<m;++i)
        for(j=0;j<n;++j)
        {
            if(M[i][j]=='S') q.push(P{i,j,0,0,0});
            else if(M[i][j]=='T') e.x=i,e.y=j;
        }
    int ans=-1;
    while(!q.empty())
    {
        P p=q.front();
        if(p.x==e.x&&p.y==e.y&&p.c==0)
        {ans=p.t;break;}
        q.pop();
        P tem;

        tem=p;
        if(p.d==0) tem.y=p.y,tem.x=p.x-1;
        else if(p.d==1) tem.y=p.y+1,tem.x=p.x;
        else if(p.d==2) tem.y=p.y,tem.x=p.x+1;
        else if(p.d==3) tem.x=p.x,tem.y=p.y-1;
        tem.c=(p.c+1)%5;
        if(tem.x>=0&&tem.x<m&&tem.y>=0&&tem.y<n&&M[tem.x][tem.y]!='#'&&!vis[tem.x][tem.y][tem.d][tem.c])
        {
            vis[tem.x][tem.y][tem.d][tem.c]=1;
            ++tem.t;
            q.push(tem);
        }
        tem=p;
        tem.t=p.t+1;
        tem.d=(p.d-1+4)%4;
        if(!vis[tem.x][tem.y][tem.d][tem.c]) {q.push(tem);vis[tem.x][tem.y][tem.d][tem.c]=1;}
        tem.d=(p.d+1)%4;
        if(!vis[tem.x][tem.y][tem.d][tem.c]) {q.push(tem);vis[tem.x][tem.y][tem.d][tem.c]=1;}
    }
    if(ans==-1) puts("destination not reachable");
    else printf("minimum time = %d sec\n",ans);

    }
    return 0;
}

你可能感兴趣的:(uva 10047 独轮车)