100200H

这是个bfs

首先建图,先从终点bfs求出每点距离,然后从起点开始,确定初始方向:某点和自己相邻距离比自己小1就是

然后就先贪心和上次一样的方向,如果不能走,就找出一个方向,把自己当前方向改掉,重复过程,直到走到终点

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
string s;
const int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
int n,m;
int can[410][410][5];
int used[410][410],d[410][410];
bool inrange(int x,int y)
{
    return (x>=1&&y>=1&&x<=m&&y<=n);
}
void bfs()
{
    queue<int>q;
    q.push(m);
    q.push(n);
    used[m][n]=1;
    while(!q.empty())
    {
        int x=q.front(); q.pop();
        int y=q.front(); q.pop();
        for(int i=0;i<4;i++)
        {
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(!used[xx][yy]&&inrange(xx,yy)&&can[x][y][i])
            {
                d[xx][yy]=d[x][y]+1;
                q.push(xx); q.push(yy);
                used[xx][yy]=1;
            }
        }
    }
}
void get_path()
{
    int x=1,y=1,last;//0:南 1:北 2:西 3:东
    if(can[x][y][1]&&d[x][y]==d[x+dx[1]][y+dy[1]]+1)
    {
        x++; cout<<"N"<<endl; last=1;
    }
    else if(can[x][y][3]&&d[x][y]==d[x+dx[3]][y+dy[3]]+1)
    {
        y++; cout<<"E"<<endl; last=3;
    }
    while(x!=m||y!=n)
    {
        if(can[x][y][last]&&d[x+dx[last]][y+dy[last]]==d[x][y]-1)
        {
            x=x+dx[last]; y=y+dy[last]; cout<<"F";
        }
        else
        for(int i=0;i<4;i++)
        {
            if(can[x][y][i]&&d[x+dx[i]][y+dy[i]]==d[x][y]-1)
            {
                x=x+dx[i]; y=y+dy[i];
                if(last==0)
                {
                    if(i==2) cout<<"R";
                    if(i==3) cout<<"L";
                }
                if(last==1)
                {
                    if(i==2) cout<<"L";
                    if(i==3) cout<<"R";
                }
                if(last==2)
                {
                    if(i==0) cout<<"L";
                    if(i==1) cout<<"R";
                }
                if(last==3)
                {
                    if(i==0) cout<<"R";
                    if(i==1) cout<<"L";
                }
                last=i; break;
            }
        }
    }
}
int main()
{
    freopen("straight.in","r",stdin);
    freopen("straight.out","w",stdout);
    scanf("%d%d",&m,&n); cin.ignore();
    for(int i=m;i>=1;i--)
    {
        getline(cin,s,‘\n‘);
        for(int j=1;j<s.length();j+=2)
        {
            if(s[j]==‘-‘)
            {
                can[i][(j+1)/2][3]=1;
                can[i][(j+2)/2+1][2]=1;
            }
        }
        if(i!=1)
        {
            getline(cin,s,‘\n‘);
            for(int j=0;j<s.length();j+=2)
            {
                if(s[j]==‘|‘)
                {
                    can[i][j/2+1][0]=1;
                    can[i-1][j/2+1][1]=1;
                }
            }
        }
    }
    bfs();
    get_path();
    fclose(stdin);
    fclose(stdout);
    return 0;
}
时间: 2024-10-21 00:03:39

100200H的相关文章