100200H
这是个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的更多相关文章
- 工作中MySql的了解到的小技巧
工作中MySql的小技巧 1. 跑脚本时,经常遇到有则更新无插入的 逻辑操作:通常情况下,来一波if()判断然后选择 更新还是插入,前两天逛论坛时发现有人在比较REPLACE INTO 和 INSET ...
随机推荐
- 炮(棋盘DP)
一直以为自己写的就是状态压缩,结果写完才知道是个棋盘dp 首先看一下题目 嗯,象棋 ,还是只有炮的象棋 对于方案数有几种,我第一个考虑是dfs,但是超时稳稳的,所以果断放弃 然后记得以前有过和这个题差 ...
- java 23 - 2 设计模式之单例模式
单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? A:把构造方法私有 B:在成员位置自己创建一个对象 C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...
- JS获取当前页面的URL信息
设置或获取对象指定的文件名或路径. <script> alert(window.location.pathname) </script> 设置或获取整个 URL 为字符串. & ...
- Eclipse中启用Oracle jdbc logging
根据自己用的JRE版本, jre1.5选择ojdbc5_g.jar, jre6选择ojdbc6_g.jar, 只有带_g的dirver才输出debug信息. maven 的配置信息: <depe ...
- Yeo 17-ROI parcellation
Reference Buckner R L, Krienen F M, Castellanos A, et al. The organization of the human cerebellum e ...
- IE8和W3C标准下IFRAME刷新和URL的区别
一个页面中包含了一个iframe,我们要刷新这个iframe的情况 url在IE8和W3C以及IE11的区别如下: URL使用相对路径,绝对路径比如http://localhost:5568/替换成I ...
- ORA-06519: active autonomous transaction detected and rolled back
这个问题一般怎么解决 ?现在忙 待会贴详细代码 先给些路子..给位大大们 引用 楼主 green3365302 的回复: 这个问题一般怎么解决 ?现在忙 待会贴详细代码 先给些路子..给位大大们 ...
- 打印机设置(PrintDialog)、页面设置(PageSetupDialog) 及 RDLC报表如何选择指定打印机
如果一台电脑同时连接多个打印机,而且每个打印机使用的纸张大小各不相同(比如:票据打印钱用的小票专用张,办公打印机用的是A4标准纸),在处理打印类的需求时,如果不用代码干预,用户必须每次打印时,都必须在 ...
- 发布我的图片预加载控件YPreLoadImg v1.0
介绍 大家好!很高兴向大家介绍我的图片预加载控件YPreLoadImg.它可以帮助您预加载图片,并且能显示加载的进度,在预加载完成后调用指定的方法. YPreLoadImg控件由一个名为PreLoad ...
- 解决 未能从程序集“System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载
先安装了 IIS ,再安装了 .net framework4.0 ,这样一来就要在cmd下注册.net framework4.0 步骤 第一步:修改配置文件 %windir%/system32/ine ...