POJ 2435Navigating the City(bfs)

题意:给你一个地图,’+’代表十字路口,‘-’‘|’表示街道,‘.’表示建筑物,‘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;
}

 

posted on 2015-07-26 17:46  积跬步、至千里  阅读(413)  评论(0编辑  收藏  举报

导航