100200H

时间:2022-10-27 00:45:59

这是个bfs

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

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

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
string s;
const int dx[]={-,,,},dy[]={,,-,};
int n,m;
int can[][][];
int used[][],d[][];
bool inrange(int x,int y)
{
return (x>=&&y>=&&x<=m&&y<=n);
}
void bfs()
{
queue<int>q;
q.push(m);
q.push(n);
used[m][n]=;
while(!q.empty())
{
int x=q.front(); q.pop();
int y=q.front(); q.pop();
for(int i=;i<;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]+;
q.push(xx); q.push(yy);
used[xx][yy]=;
}
}
}
}
void get_path()
{
int x=,y=,last;//0:南 1:北 2:西 3:东
if(can[x][y][]&&d[x][y]==d[x+dx[]][y+dy[]]+)
{
x++; cout<<"N"<<endl; last=;
}
else if(can[x][y][]&&d[x][y]==d[x+dx[]][y+dy[]]+)
{
y++; cout<<"E"<<endl; last=;
}
while(x!=m||y!=n)
{
if(can[x][y][last]&&d[x+dx[last]][y+dy[last]]==d[x][y]-)
{
x=x+dx[last]; y=y+dy[last]; cout<<"F";
}
else
for(int i=;i<;i++)
{
if(can[x][y][i]&&d[x+dx[i]][y+dy[i]]==d[x][y]-)
{
x=x+dx[i]; y=y+dy[i];
if(last==)
{
if(i==) cout<<"R";
if(i==) cout<<"L";
}
if(last==)
{
if(i==) cout<<"L";
if(i==) cout<<"R";
}
if(last==)
{
if(i==) cout<<"L";
if(i==) cout<<"R";
}
if(last==)
{
if(i==) cout<<"R";
if(i==) 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>=;i--)
{
getline(cin,s,'\n');
for(int j=;j<s.length();j+=)
{
if(s[j]=='-')
{
can[i][(j+)/][]=;
can[i][(j+)/+][]=;
}
}
if(i!=)
{
getline(cin,s,'\n');
for(int j=;j<s.length();j+=)
{
if(s[j]=='|')
{
can[i][j/+][]=;
can[i-][j/+][]=;
}
}
}
}
bfs();
get_path();
fclose(stdin);
fclose(stdout);
return ;
}

相关文章