1. 程式人生 > >Abbott's 復仇(bfs 求最短路

Abbott's 復仇(bfs 求最短路

empty through name amp ret mes any while for

題目超長處理超麻煩

方向最後直接用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; }

Abbott's 復仇(bfs 求最短路