UVA10047----The Monocycle

變量實在弄的太亂了!!!

用vis記錄狀態,座標,顏色,方向。

然後就是研究一下方向,直接bfs過去。(UVA的格式錯誤提示WA,操蛋)

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
char g[30][30];
int vis[30][30][6][6];
int n,m;
int sx,sy,ex,ey;
struct node{
    int x,y,dir,se,step;
    friend bool operator<(node a,node b){
        return a.step>b.step;
    }
};
//0 1 2 3 北 南 西 東
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};

void bfs()
{
    priority_queue<node> q;
    while(!q.empty()) q.pop();
    node t;
    t.x=sx,t.y=sy,t.step=0,t.se=0,t.dir=0;
    q.push(t);
    vis[sx][sy][0][0]=1;//x  y  dir se
    bool flag=false;
    while(!q.empty()){
        node u=q.top();
        q.pop();
        if(u.x==ex&&u.y==ey&&u.se==0){
            printf("minimum time = %d sec\n",u.step);
            flag=true;
            break;
        }

        node v=u;
        for(int i=0;i<4;i++){
         if(u.dir==i)//同向
         {
             v.x=u.x+dx[i];
             v.y=u.y+dy[i];
             v.dir=u.dir;
             v.se=(u.se+1)%5;
             v.step=u.step+1;
             if(g[v.x][v.y]!='#'&&v.x>=0&&v.x<n&&v.y>=0&&v.y<m)
             if(!vis[v.x][v.y][v.dir][v.se]){
                vis[v.x][v.y][v.dir][v.se]=1;
                q.push(v);
             }
         }
         else{//不同向
                if(u.dir==0&&i==1) v.step=u.step+2;
                else if(u.dir==1&&i==0) v.step=u.step+2;
                else if(u.dir==2&&i==3) v.step=u.step+2;
                else if(u.dir==3&&i==2) v.step=u.step+2;
                else v.step=u.step+1;
                v.dir=i;
                v.x=u.x;
                v.y=u.y;
                v.se=u.se;
                if(!vis[v.x][v.y][v.dir][v.se]){
                vis[v.x][v.y][v.dir][v.se]=1;
                q.push(v);
             }
             }
         }

    }
    if(!flag) printf("destination not reachable\n");
}
int main()
{
    int cas=1,ca=0;
    while(scanf("%d%d",&n,&m)&&n&&m){

        for(int i=0;i<n;i++)
            scanf("%s",g[i]);
        memset(vis,0,sizeof vis);

        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++){
            if(g[i][j]=='S'){
                sx=i,sy=j;
            }
            if(g[i][j]=='T'){
                ex=i,ey=j;
            }
        }
        if(ca) printf("\n");
        ca=1;
        printf("Case #%d\n",cas++);
        bfs();

    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章