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;

}

 

你可能感兴趣的:(poj)