• 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]!='';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;
    }
  • 相关阅读:
    openCV中cvSnakeImage()函数代码分析
    程序所有重构,升级的目标(备注,更新)
    基础总结篇之中的一个:Activity生命周期
    Tomcat全攻略
    VRRP协议具体解释
    二叉树三种遍历(递归以及非递归实现)
    AssertValid函数学习
    java定时器的使用(Timer)
    循环队列
    使用Heartbeat实现双机热备
  • 原文地址:https://www.cnblogs.com/-ifrush/p/10422464.html
Copyright © 2020-2023  润新知