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; }