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 ...
随机推荐
- 强加密RNGCryptoServiceProvider
.net RNGCryptoServiceProvider 对应 java SecureRandom public class SecureRandomextends Random This cla ...
- Jquery操作下拉框(DropDownList)实现取值赋值
Jquery操作下拉框(DropDownList)想必大家都有所接触吧,下面与大家分享下对DropDownList进行取值赋值的实现代码 1. 获取选中项: 获取选中项的Value值: $('sele ...
- Windows Phone App Studio 无码开发手机应用
上周微软发布了一款基于Web的Windows Phone应用开发工具 "Windows Phone App Studio".它与大家熟知Visual Studio的最大不同之处是W ...
- HP “云图”GPU虚拟化工作站解决方案
HP PCS ”云图”GPU虚拟化工作站解决方案 ——将图形计算从桌面移到数据中心 惠普云图形GPU虚拟化桌面系统是以用户为中心的私有云服务.除了保留了传统桌面虚拟化方案以集中设备为中心统一管理等优点 ...
- 谈谈软件项目的dependency
说到软件项目的依赖管理,可以从三个方面来考虑: 一.由build system控制的dependency 现在的build system,都支持一定程度上的dependency management, ...
- github开源:企业级应用快速开发框架CIIP WEB+WIN+移动端
简介 CIIP是基于XAF开发的开源信息系统框架.CIIP最常见的应用场景是基于数据库的企业级应用程序,例如供应链系统,ERP系统,MRP系统,CRM系统等. CIIP支持WEB版本.Windows桌 ...
- Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统
前言 写这篇博客是为了给我的愚蠢和浪费的6个小时买单! 过程原因分析 我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github.在以前的拓扑创建过程中,我都是用 ...
- 基于PHP的AJAX学习笔记(教程)
本文转载自:http://www.softeng.cn/?p=107 这是本人在学习ajax过程所做的笔记,通过本笔记的学习,可以完成ajax的快速入门.本笔记前端分别使用原生态的javascript ...
- .net破解二(修改dll)
多谢大家支持! 昨天说了一下反编译与剥壳(.net破解一(反编译,反混淆-剥壳,工具推荐)),今天就来修改修改dll,为了方便,我自己写一个简单程序用来测试 代码如下: 一个 ConsoleAppli ...
- 在CentOS上部署基于dnx/coreclr的ASP.NET 5应用程序
在Ubuntu上写好了一个简单的ASP.NET 5应用程序,尝试将这个程序部署在没有mono环境的CentOS服务器上. 部署步骤如下: 1)安装libuv(KestrelHttpServer需要它) ...