这是个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 ;
}

100200H的更多相关文章

  1. 工作中MySql的了解到的小技巧

    工作中MySql的小技巧 1. 跑脚本时,经常遇到有则更新无插入的 逻辑操作:通常情况下,来一波if()判断然后选择 更新还是插入,前两天逛论坛时发现有人在比较REPLACE INTO 和 INSET ...

随机推荐

  1. Android 中布局设置导致的TextView不显示的问题

    将TextView放入TableLayout中,设置TextView的Layout Witdh/Layout Height 为Wrap Content或其他大小,导致TextView内容无法显示,改为 ...

  2. js抽奖跑马灯程序

    js抽奖跑马灯程序 点击下载代码

  3. JS 中如何判断 undefined 和 null

    JS 中如何判断 undefined JavaScript 中有两个特殊数据类型:undefined 和 null,下节介绍了 null 的判断,下面谈谈 undefined 的判断. 以下是不正确的 ...

  4. druid 数据源 使用属性文件的一个坑

    直接上代码: <bean id="propertiesFactoryBean" class="org.springframework.beans.factory.c ...

  5. Git开发备忘

    1.在Git中,上传了中文命名的文件,但是后面想删除的时候,发现中文命名被转义了. 利用Git add是无法添加这类文件的,所以这里我们需要用到 git add -u命令,即可实现成功添加. 2.在G ...

  6. sublime text2 打开包含中文的文件会自动追加.dump后缀解决办法

    用sublime text2 打开.c, .h,.txt等文件会自动追加一个.dump后缀,這样在打开.c,.h等文件时无法正常识别,从而无法正常进行语法着色,网上说是因为安装了GBK Encodin ...

  7. C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8"的响应正文。...

    在调试一个WebApi程序时,出现下面错误: 通过分析怀疑是未添加序列化属性引起的,实体类改为下面结构后,问题依旧: 通过查阅资料和不断尝试,修改实体类的属性注解搞定:

  8. dirtycow漏洞

    dirtycow漏洞,原理还没看懂,找了几个PoC实验了一下. dirtyc0w.c我在CentOS和Kali上都失败了 pokemon.c在CentOS上成功修改了只读文件,不过修改的不是很顺利,结 ...

  9. linux中vi编辑器的使用

    vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本 编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任 何版本,vi编辑器是完 ...

  10. 强迫症的福利——我的第一个VS插件,对using排序!

    首先来看看VS自带的using整理功能: 长短不一,看着让人生厌!这是哪个门子的整理?越来越乱了好吗! 难道就没有一款,由短到长——金字塔搬的排序方案吗? 于是各种百度: “VS 插件 using排序 ...