感觉题意有点问题,很多情况没解释,我们暂且相信没有那么多其奇怪的地图吧。比如SE或者S--E这样的地图是不存在的。
每次bfs的时候,一个方向走2步,每一步都要判断是否能走,其他的就没什么了。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <queue> using namespace std; char mp[500][500]; bool vis[500][500]; int n,m; char h[]="WENS"; int dx[]={0,0,-1,1};//左右上下 int dy[]={-1,1,0,0}; vector<char> ans; struct node { int x,y; }q[100000],st,f,r; int fa[100000],path[100000]; bool isok(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m&&mp[x][y]!='.'&&!vis[x][y]) return true; return false; } bool trans(int x1,int y1,int x2,int y2,int d) { if(mp[x1][y1]=='+'||mp[x1][y1]=='S') return true; else if(mp[x1][y1]=='|'&&d>=2) return true; else if(mp[x1][y1]=='-'&&d<2) return true; return false; } void print(int p) { if(p==0) return; print(fa[p]); ans.push_back(h[path[p]]); } void bfs() { memset(vis,0,sizeof(vis)); int rear=0,front=0; q[rear++]=st; while(front<rear) { f=q[front]; for(int d=0;d<4;d++) { int nx1=f.x+dx[d]; int ny1=f.y+dy[d]; int nx2=nx1+dx[d]; int ny2=ny1+dy[d]; if(!isok(nx1,ny1)||!isok(nx2,ny2)||!trans(f.x,f.y,nx1,ny1,d)||!trans(nx1,ny1,nx2,ny2,d)) continue; vis[nx1][ny1]=vis[nx2][ny2]=1; r.x=nx2; r.y=ny2; fa[rear]=front; path[rear]=d; if(mp[nx2][ny2]=='E') { print(rear); int times=0; for(int i=0;i<ans.size();i++) { times++; if(i==ans.size()||ans[i]!=ans[i+1]) { printf("%c %d\n",ans[i],times); times=0; } } return; } q[rear++]=r; } front++; } } int main() { int debugx,debugy; while(~scanf("%d%d",&n,&m)) { ans.clear(); n=n*2-1; m=m*2-1; for(int i=1;i<=n;i++) { scanf("%s",mp[i]+1); for(int j=1;j<=m;j++) { if(mp[i][j]=='S') { st.x=i; st.y=j; } if(mp[i][j]=='E') { debugx=i; debugy=j; } } } if(abs(st.x-debugx)+abs(st.y-debugy)%2==1) { puts("数据有问题"); while(1); } bfs(); } return 0; }