poj Navigating the City 水bfs

感觉题意有点问题,很多情况没解释,我们暂且相信没有那么多其奇怪的地图吧。比如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;
}


你可能感兴趣的:(poj Navigating the City 水bfs)