Abbott's 复仇(bfs 求最短路

题目超长处理超麻烦

方向最后直接用map表示了,没用lrj的编码方法

储存路径的bfs树用数组实现的 没用书上的结构体建树

这个题拖这么久才写出来也算了结一桩心事

ac代码:

#include<bits/stdc++.h>
using namespace std;
string name;
queue<int> q;
stack <int> s;
map <char,int> id_dir;

int iswalk[10][10][5][4],pass[10][10][5];
int nowx[1000],nowy[1000],nowd[1000],last[1000],bex,bey,bedr,anx,any;
int ans=-1;
void walk(int dir,int turn,int cnt){
    if(turn==1) dir=(dir+1)%4;
    else if(turn==-1) dir=(dir+3)%4;
    nowd[cnt]=dir;
    if(dir==1) nowx[cnt]--;
    if(dir==2) nowy[cnt]++;
    if(dir==3) nowx[cnt]++;
    if(dir==0) nowy[cnt]--;    
}

void bfs(){
    int cnt=1,flag=1;
    q.push(cnt); 
    while(!q.empty()){
        int t=q.front(); q.pop();
        int x=nowx[t],y=nowy[t],d=nowd[t];  //cout<<"here"<<x<<','<<y<<','<<d<<endl;
          if(flag&&x==anx&&y==any){
                ans=t; flag=0;
           }
           
        if(!pass[x][y][d]){
            pass[x][y][d]=1;
            if(iswalk[x][y][d][1]){
                cnt++; nowx[cnt]=x; nowy[cnt]=y; last[cnt]=t;
                walk (d,0,cnt); q.push(cnt);
            }
            if(iswalk[x][y][d][2]){
                cnt++; nowx[cnt]=x; nowy[cnt]=y; last[cnt]=t;
                walk (d,1,cnt); q.push(cnt);                
            }
            if(iswalk[x][y][d][3]){
                cnt++; nowx[cnt]=x; nowy[cnt]=y; last[cnt]=t;
                walk (d,-1,cnt); q.push(cnt);                        
            }
        }
    }
}

void inread(){
    int x,y,d,f;
    string op;
    while(cin>>x&&x){
        cin>>y;
        while(cin>>op&&op!="*"){
            d=id_dir[op[0]];
            for(int i=1;op [i]!='\0';i++){
                f=id_dir[op[i]];
                iswalk[x][y][d][f]=1;
            }    
        }
    }
}

void output(){
    cout<<name<<endl;
    if(ans==-1)cout<<"  No Solution Possible";
    else{
      while(ans!=-1){
        s.push(ans);
        ans=last[ans];
        }
        int i=0;
      while(!s.empty()){
          int x=s.top(); s.pop();
          if(i&&i%10==0)cout<<endl<<' ';
          if(i==0)cout<<' ';
          cout<<' '<<'('<<nowx[x]<<','<<nowy[x]<<')';
          i++;
      }        
    }
}
int main(){
id_dir['N']=1;
id_dir['E']=2;
id_dir['S']=3;
id_dir['W']=0;
id_dir['F']=1;
id_dir['R']=2;
id_dir['L']=3;
    while(cin>>name){
        ans=-1; memset(pass,0,sizeof(pass));
        memset(iswalk,0,sizeof(iswalk));
        if(name=="END")break;
        char c;
        cin>>bex>>bey>>c>>anx>>any;
        bedr=id_dir[c];
        nowx[1]=nowx[0]=bex; nowy[1]=nowy[0]=bey; last[0]=-1; last[1]=0;
        walk(bedr,0,1);
        inread();
        bfs();
        output();
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/-ifrush/p/10422464.html
今日推荐