题目超长处理超麻烦
方向最后直接用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]!='