题意:给你一个地图,’+’代表十字路口,‘-’‘|’表示街道,‘.’表示建筑物,‘s’,’E’ 起点和终点。输出从起点到终点的的 最短路径(包括方向和沿该方向的经过的十字路口数)
分析:ans[i][j],起点到(i,j)点的最短路径,bfs求出所有,再从终点回推到起点得最短路径。
#include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <vector> #include <string> #include <cctype> #include <complex> #include <cassert> #include <utility> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; typedef pair<int,int> PII; typedef long long ll; #define lson l,m,rt<<1 #define pi acos(-1.0) #define rson m+1,r,rt<<11 #define All 1,N,1 #define read freopen("in.txt", "r", stdin) const ll INFll = 0x3f3f3f3f3f3f3f3fLL; const int INF= 0x7ffffff; const int mod = 1000000007; struct point{ int x,y; }; int ans[100][100],n,m,mapc[100][100]; int sx,sy,ex,ey; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int dirc[10010],dept[10010],index=0; void bfs(){ point a,b; memset(ans,0x3f,sizeof(ans)); a.x=sx;a.y=sy; ans[sx][sy]=0; queue<point>q; q.push(a); while(!q.empty()){ b=q.front(); q.pop(); if(b.x==ex&&b.y==ey){ break; } for(int i=0;i<4;++i){ int xx=b.x+dir[i][0]; int yy=b.y+dir[i][1]; if(xx<0||xx>=n||yy<0||yy>=m||!mapc[xx][yy]||ans[xx][yy]<=ans[b.x][b.y]+1) continue; ans[xx][yy]=ans[b.x][b.y]+1; a.x=xx; a.y=yy; q.push(a); } } //逆向求路径 int tx=ex,ty=ey,ncase=-1,num=0; while(tx!=sx||ty!=sy){ for(int i=0;i<4;++i){ int xx=tx+dir[i][0]; int yy=ty+dir[i][1]; if(xx<0||xx>=n||yy<0||yy>=m||!mapc[xx][yy]||ans[xx][yy]!=ans[tx][ty]-1)continue; if(mapc[xx][yy]==1) num++; if(ncase!=i&&ncase!=-1){ dirc[++index]=ncase; dept[index]=num; num=0; } ncase=i; tx=xx; ty=yy; } } dirc[++index]=ncase; dept[index]=num+1; } int main() { char dic[4]={‘W‘,‘N‘,‘E‘,‘S‘}; scanf("%d%d",&n,&m); n=2*n-1; m=2*m-1; char ch; for(int i=0;i<n;++i) for(int j=0;j<m;++j) { cin>>ch; if(ch==‘.‘)mapc[i][j]=0; else if(ch==‘+‘)mapc[i][j]=1; else if(ch==‘S‘){mapc[i][j]=2;sx=i;sy=j;} else if(ch==‘E‘){mapc[i][j]=3;ex=i;ey=j;} else mapc[i][j]=4; } /*for(int i=0;i<n;++i){ for(int j=0;j<m;++j) cout<<mapc[i][j]<<" "; cout<<endl; }*/ bfs(); for(int i=index;i>=1;--i) printf("%c %d\n",dic[dirc[i]],dept[i]); return 0; }
时间: 2024-11-09 17:27:38