这是个bfs

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

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

  1. #include<iostream>
  2. #include<queue>
  3. #include<cstdio>
  4. using namespace std;
  5. string s;
  6. const int dx[]={-,,,},dy[]={,,-,};
  7. int n,m;
  8. int can[][][];
  9. int used[][],d[][];
  10. bool inrange(int x,int y)
  11. {
  12. return (x>=&&y>=&&x<=m&&y<=n);
  13. }
  14. void bfs()
  15. {
  16. queue<int>q;
  17. q.push(m);
  18. q.push(n);
  19. used[m][n]=;
  20. while(!q.empty())
  21. {
  22. int x=q.front(); q.pop();
  23. int y=q.front(); q.pop();
  24. for(int i=;i<;i++)
  25. {
  26. int xx=x+dx[i];
  27. int yy=y+dy[i];
  28. if(!used[xx][yy]&&inrange(xx,yy)&&can[x][y][i])
  29. {
  30. d[xx][yy]=d[x][y]+;
  31. q.push(xx); q.push(yy);
  32. used[xx][yy]=;
  33. }
  34. }
  35. }
  36. }
  37. void get_path()
  38. {
  39. int x=,y=,last;//0:南 1:北 2:西 3:东
  40. if(can[x][y][]&&d[x][y]==d[x+dx[]][y+dy[]]+)
  41. {
  42. x++; cout<<"N"<<endl; last=;
  43. }
  44. else if(can[x][y][]&&d[x][y]==d[x+dx[]][y+dy[]]+)
  45. {
  46. y++; cout<<"E"<<endl; last=;
  47. }
  48. while(x!=m||y!=n)
  49. {
  50. if(can[x][y][last]&&d[x+dx[last]][y+dy[last]]==d[x][y]-)
  51. {
  52. x=x+dx[last]; y=y+dy[last]; cout<<"F";
  53. }
  54. else
  55. for(int i=;i<;i++)
  56. {
  57. if(can[x][y][i]&&d[x+dx[i]][y+dy[i]]==d[x][y]-)
  58. {
  59. x=x+dx[i]; y=y+dy[i];
  60. if(last==)
  61. {
  62. if(i==) cout<<"R";
  63. if(i==) cout<<"L";
  64. }
  65. if(last==)
  66. {
  67. if(i==) cout<<"L";
  68. if(i==) cout<<"R";
  69. }
  70. if(last==)
  71. {
  72. if(i==) cout<<"L";
  73. if(i==) cout<<"R";
  74. }
  75. if(last==)
  76. {
  77. if(i==) cout<<"R";
  78. if(i==) cout<<"L";
  79. }
  80. last=i; break;
  81. }
  82. }
  83. }
  84. }
  85. int main()
  86. {
  87. freopen("straight.in","r",stdin);
  88. freopen("straight.out","w",stdout);
  89. scanf("%d%d",&m,&n); cin.ignore();
  90. for(int i=m;i>=;i--)
  91. {
  92. getline(cin,s,'\n');
  93. for(int j=;j<s.length();j+=)
  94. {
  95. if(s[j]=='-')
  96. {
  97. can[i][(j+)/][]=;
  98. can[i][(j+)/+][]=;
  99. }
  100. }
  101. if(i!=)
  102. {
  103. getline(cin,s,'\n');
  104. for(int j=;j<s.length();j+=)
  105. {
  106. if(s[j]=='|')
  107. {
  108. can[i][j/+][]=;
  109. can[i-][j/+][]=;
  110. }
  111. }
  112. }
  113. }
  114. bfs();
  115. get_path();
  116. fclose(stdin);
  117. fclose(stdout);
  118. return ;
  119. }

100200H的更多相关文章

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

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

随机推荐

  1. 强加密RNGCryptoServiceProvider

    .net RNGCryptoServiceProvider 对应 java SecureRandom public class SecureRandomextends Random  This cla ...

  2. Jquery操作下拉框(DropDownList)实现取值赋值

    Jquery操作下拉框(DropDownList)想必大家都有所接触吧,下面与大家分享下对DropDownList进行取值赋值的实现代码 1. 获取选中项: 获取选中项的Value值: $('sele ...

  3. Windows Phone App Studio 无码开发手机应用

    上周微软发布了一款基于Web的Windows Phone应用开发工具 "Windows Phone App Studio".它与大家熟知Visual Studio的最大不同之处是W ...

  4. HP “云图”GPU虚拟化工作站解决方案

    HP PCS ”云图”GPU虚拟化工作站解决方案 ——将图形计算从桌面移到数据中心 惠普云图形GPU虚拟化桌面系统是以用户为中心的私有云服务.除了保留了传统桌面虚拟化方案以集中设备为中心统一管理等优点 ...

  5. 谈谈软件项目的dependency

    说到软件项目的依赖管理,可以从三个方面来考虑: 一.由build system控制的dependency 现在的build system,都支持一定程度上的dependency management, ...

  6. github开源:企业级应用快速开发框架CIIP WEB+WIN+移动端

    简介 CIIP是基于XAF开发的开源信息系统框架.CIIP最常见的应用场景是基于数据库的企业级应用程序,例如供应链系统,ERP系统,MRP系统,CRM系统等. CIIP支持WEB版本.Windows桌 ...

  7. Mininet在创建拓扑的过程中为什么不打印信息了——了解Mininet的log系统

    前言 写这篇博客是为了给我的愚蠢和浪费的6个小时买单! 过程原因分析 我用Mininet创建过不少拓扑了,这次创建的拓扑非常简单,如下图,创建拓扑的代码见github.在以前的拓扑创建过程中,我都是用 ...

  8. 基于PHP的AJAX学习笔记(教程)

    本文转载自:http://www.softeng.cn/?p=107 这是本人在学习ajax过程所做的笔记,通过本笔记的学习,可以完成ajax的快速入门.本笔记前端分别使用原生态的javascript ...

  9. .net破解二(修改dll)

    多谢大家支持! 昨天说了一下反编译与剥壳(.net破解一(反编译,反混淆-剥壳,工具推荐)),今天就来修改修改dll,为了方便,我自己写一个简单程序用来测试 代码如下: 一个 ConsoleAppli ...

  10. 在CentOS上部署基于dnx/coreclr的ASP.NET 5应用程序

    在Ubuntu上写好了一个简单的ASP.NET 5应用程序,尝试将这个程序部署在没有mono环境的CentOS服务器上. 部署步骤如下: 1)安装libuv(KestrelHttpServer需要它) ...