UVA 816 - Abbott's Revenge

option=com_onlinejudge&Itemid=8&page=show_problem&category=599&problem=757&mosmsg=Submission+received+with+ID+14332151" target="_blank" style="">题目链接

题意:一个迷宫,每一个点限制了从哪一方向来的。仅仅能往左右前走,然后问起点到终点的最短路径

思路:BFS。每一个点拆成4个方向的点。相应能走的方向建图跑一下bfs就可以

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. const int N = 10005;
  9. const int D[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
  10. char name[25];
  11.  
  12. int n, m;
  13. vector<int> g[15][15][4];
  14.  
  15. struct State {
  16. int x, y, dir;
  17. int pre;
  18. } Q[N], s, e;
  19.  
  20. char str[25];
  21. int x, y, vis[15][15][4];
  22.  
  23. int hash(char c) {
  24. if (c == 'F') return 0;
  25. if (c == 'R') return 1;
  26. if (c == 'L') return -1;
  27. if (c == 'N') return 0;
  28. if (c == 'E') return 1;
  29. if (c == 'S') return 2;
  30. return 3;
  31. }
  32.  
  33. #define MP(a,b) make_pair(a,b)
  34. typedef pair<int, int> pii;
  35. vector<pii> ans;
  36.  
  37. void print(int u) {
  38. if (u == -1) return;
  39. print(Q[u].pre);
  40. ans.push_back(MP(Q[u].x, Q[u].y));
  41. }
  42.  
  43. void bfs() {
  44. ans.clear();
  45. memset(vis, 0, sizeof(vis));
  46. int head = 0, rear = 0; s.pre = -1;
  47. Q[rear++] = s;
  48. vis[s.x][s.y][s.dir] = 1;
  49. while (head < rear) {
  50. State u = Q[head++];
  51. if (u.x == e.x && u.y == e.y) {
  52. print(head - 1);
  53. int tot = ans.size();
  54. for (int i = 0; i < tot; i++) {
  55. if (i % 10 == 0) printf("\n ");
  56. printf(" (%d,%d)", ans[i].first, ans[i].second);
  57. }
  58. printf("\n");
  59. return;
  60. }
  61. for (int i = 0; i < g[u.x][u.y][u.dir].size(); i ++) {
  62. int di = (g[u.x][u.y][u.dir][i] + u.dir + 4) % 4;
  63. State v = u;
  64. v.x += D[di][0]; v.y += D[di][1];
  65. if (v.x < 0 || v.y < 0) continue;
  66. v.dir = di;
  67. if (vis[v.x][v.y][v.dir]) continue;
  68. vis[v.x][v.y][v.dir] = 1;
  69. v.pre = head - 1;
  70. Q[rear++] = v;
  71. }
  72. }
  73. printf("\n No Solution Possible\n");
  74. }
  75.  
  76. int main() {
  77. while (~scanf("%s", name) && strcmp(name, "END")) {
  78. memset(g, 0, sizeof(g));
  79. printf("%s", name);
  80. scanf("%d%d%s", &s.x, &s.y, str);
  81. s.dir = hash(str[0]);
  82. scanf("%d%d", &e.x, &e.y);
  83. g[s.x][s.y][hash(str[0])].push_back(0);
  84. int x, y;
  85. while (scanf("%d", &x) && x) {
  86. scanf("%d", &y);
  87. while (scanf("%s", str) && str[0] != '*') {
  88. int len = strlen(str);
  89. for (int i = 1; i < len; i++)
  90. g[x][y][hash(str[0])].push_back(hash(str[i]));
  91. }
  92. }
  93. bfs();
  94. }
  95. return 0;
  96. }

UVA 816 - Abbott&#39;s Revenge(BFS)的更多相关文章

  1. uva 816 - Abbott&#39;s Revenge(有点困难bfs迷宫称号)

    是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...

  2. uva 816 abbott&#39;s revenge ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r

  3. UVA - 816 Abbott's Revenge(bfs)

    题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...

  4. UVA 816 -- Abbott's Revenge(BFS求最短路)

     UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...

  5. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  6. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  7. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  8. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  9. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

随机推荐

  1. java正则表达式Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  2. 大数据性能调优之HBase的RowKey设计

    1 概述 HBase是一个分布式的.面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式. 既然HBase是采用KeyValue ...

  3. 【Android】以SimpleAdapter做适配器的ListView和GridView

    SimpleAdapter介绍 SimpleAdapter是一个简单的适配器,可以将静态数据映射到XML文件中定义好的视图. 构造函数 public SimpleAdapter (Context co ...

  4. java 使用相对路径读取文件

    java 使用相对路径读取文件 1.java project环境,使用java.io用相对路径读取文件的例子: *目录结构:  DecisionTree            |___src      ...

  5. Selenium用户扩展

    Selenium用户扩展 这很容易扩展Selenium IDE加入自定义操作,断言和定位,策略,这是通过添加方法,在JavaScript的帮助下Selenium 对象原型.在启动时,Selenium会 ...

  6. Config配置文件详解

    (默认的配置设置)以下所有的代码都应该位于 <configuration> <system.web> 和 </system.web> </configurat ...

  7. void、void*以及NULL

    void.void*以及NULL 写在前面 在使用C++的过程中,void和NULL用到的频率挺高的,但是从来没有去探索过这两个关键字的联系和区别,也没有对它们做更多的探索.对于void*,说实话,实 ...

  8. Java中的return

    比如你写了一个叫getInt的类public int getInt(){ //这个类的意思就是一个具有返回值类型为int的类了 //通常如果不需要返回值的话 这里就写void....//你的具体代码r ...

  9. 详解 jupyter notebook 集成 spark 环境安装

    来自: 代码大湿 代码大湿 1 相关介绍 jupyter notebook是一个Web应用程序,允许你创建和分享,包含活的代码,方程的文件,可视化和解释性文字.用途包括:数据的清洗和转换.数值模拟.统 ...

  10. CommandLine 和 Options

    用到的jar包 <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli& ...