题意:一个迷宫,每个交叉路口有一路标,限制了你从某方向进入该路口所能进入的路口。

题解:1.对于方向的处理:将node多增加一维dir,通过一个const 字符数组 加 上dir_id函数 以及一个方向数组 快速完成从读取字母到模拟路口限制的转换。

   2.用一个四位数组记录某节点某方向是否能走,

      3.对于路径的记录,用node p[] 记录当前节点的前一个节点,然后将其中的元素push到一个vector里面再输出。

  

坑:1.no possible input 多了个空格(紫书上没有前缀空格)

  自己写的read_input,结果显示忘记了初始化,

  第一步理解错误。

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "stdio.h"
  3. #include<stdio.h>
  4. #include<algorithm>
  5. #include<string>
  6. #include<vector>
  7. #include<list>
  8. #include<set>
  9. #include<iostream>
  10. #include<string.h>
  11. #include<queue>
  12. #include<string>
  13. #include<sstream>
  14. using namespace std;
  15. const int maxn = +;
  16.  
  17. const char* dirs = "NESW";
  18. const char* turns = "FLR";
  19. int dir_id(char c) { return strchr(dirs, c) - dirs; }
  20. int turn_id(char c) { return strchr(turns, c) - turns; }
  21.  
  22. const int dr[] = { -,,, };
  23. const int dc[] = { ,,,- };
  24. //NESW
  25. int r1, c1,r0,c0,r2,c2,dir,mxr,mxc;
  26.  
  27. struct node {
  28. int r, c, dir;
  29. node(int r = , int c = , int dir = ) :r(r), c(c), dir(dir) {}
  30. };
  31. node walk(const node& u, int turn) {
  32. int dir = u.dir;
  33. if (turn == )dir = (dir + ) % ;
  34. if (turn == ) dir = (dir + ) % ;
  35. return node(u.r + dr[dir], u.c + dc[dir], dir);
  36. }
  37. int d[maxn][maxn][maxn];
  38. node p[maxn][maxn][maxn];
  39. int has_edge[maxn][maxn][maxn][maxn];
  40. bool inside(int r,int c) {
  41. return (r>=&&r<=&&c>=&&c<=);
  42. }
  43. void print_ans(node u) {
  44. vector<node> nodes;
  45. for (;;) {
  46. nodes.push_back(u);
  47. if (d[u.r][u.c][u.dir] == )break;
  48. u = p[u.r][u.c][u.dir];
  49. }
  50. nodes.push_back(node(r0, c0, dir));
  51.  
  52. int cnt = ;
  53. for (int i = nodes.size() - ; i >= ; i--) {
  54. if (cnt % == ) cout << ' ';
  55. printf(" (%d,%d)", nodes[i].r, nodes[i].c);
  56. if (++cnt % == ) cout << endl;
  57. }
  58. if (nodes.size() % != )cout << endl;
  59. }
  60. void solve() {
  61. queue<node>Q;
  62. memset(d, -, sizeof(d));
  63. node u(r1, c1, dir);
  64. d[u.r][u.c][u.dir]=;
  65. Q.push(u);
  66. while (!Q.empty()) {
  67. node u = Q.front(); Q.pop();
  68. if (u.r == r2&&u.c == c2) { print_ans(u); return; }
  69. for (int i = ; i < ; i++) {
  70. node v = walk(u, i);
  71. if (has_edge[u.r][u.c][u.dir][i] && d[v.r][v.c][v.dir] < &&inside(v. r,v.c)) {
  72. d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + ;
  73. p[v.r][v.c][v.dir] = u;
  74. Q.push(v);
  75. }
  76. }
  77.  
  78. }
  79. printf(" No Solution Possible\n");
  80. }
  81. string s;
  82. bool read_input() {
  83.  
  84. string ch;
  85. cin >> s; if (s == "END")return false;
  86. cout << s << endl;
  87.  
  88. cin >> r0 >> c0 >>ch>>r2>>c2;//mxr=max(r0,r)
  89.  
  90. dir = dir_id(ch[]);
  91. r1 = r0 + dr[dir];
  92. c1 = c0 + dc[dir];
  93. memset(has_edge, , sizeof(has_edge));
  94. //node u1 (r0, c0, dir);
  95. //u1 = walk(u1, dir);
  96. //r1 = u1.r, c1 = u1.c, dir = u1.dir;
  97. int c, r;
  98. while (cin >> r) {
  99. if (r == )break;
  100. cin >> c;
  101. char ss[];
  102. for (;;) {
  103. scanf("%s", ss);
  104. if (ss[] == '*')break;
  105. for (int i = ; i < strlen(ss); i++)
  106. has_edge[r][c][dir_id(ss[])][turn_id(ss[i])]=;
  107. }
  108. }
  109. return true;
  110. }
  111. int main(){
  112. while (read_input()) {
  113.  
  114. solve();
  115. }
  116.  
  117. system("pause");
  118. return ;
  119. }

【紫书】【重要】Abbott's Revenge UVA - 816 bfs 复杂模拟 带方向参数的迷宫的更多相关文章

  1. Abbott's Revenge UVA - 816 (输出bfs路径)

    题目链接:https://vjudge.net/problem/UVA-816 题目大意: 有一个最多包含9*9 个交叉点的迷宫.输入起点,离开起点时的朝向和终点,求一条最短路(多解时任意输出 一个即 ...

  2. UVa 816 (BFS求最短路)

    /*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (cons ...

  3. BFS求最短路 Abbottt's Revenge UVa 816

    本题的题意是输入起点,朝向和终点,求一条最短路径(多解时任意输出一个即可) 本题的主要代码是bfs求解,就是以下代码中的slove的主要部分,通过起点按照路径的长度来寻找最短路径,输出最先到终点的一系 ...

  4. 【紫书】Undraw the Trees UVA - 10562 递归,字符串

    题意:给你画了一颗树,你要把它的前序输出. 题解:读进到二维数组.边解析边输出. 坑:少打了个-1. #define _CRT_SECURE_NO_WARNINGS #include<cstri ...

  5. 【紫书】Play on Words UVA - 10129 欧拉回路

    题意:给你1e5个字符串,若前一个的末尾字母等于当前的首字母,则可以连在一起(成语接龙一个意思)判断是否可以将他们连在一起 题解:将首位看作点,单词看作边.变成欧拉回路问题. 判断出入度是否相等,再用 ...

  6. 【紫书】 The Falling Leaves UVA - 699 递归得简单

    题意:给你一颗二叉树的前序遍历,空子树以-1表示,将左右子树的权值投影到一维数轴上,左儿子位置为根位置-1,右儿子+1求个个整点上的和: 题解:递归,整个过程只需维护一个sum数组. 更新根,更新le ...

  7. uva 816 BFS求最短路的经典问题……

    一开始情况没有考虑周全,直接WA掉了, 然后用fgets()出现了WA,给改成scanf就AC了 题目不是很难,用心就好…… #include <iostream> #include &l ...

  8. UVA 816 bfs

    算法入门经典上面的题.题目链接 uva816 大致题意 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可).详细题意请看原题 思路 其实就是b ...

  9. UVA816 Abbott's Revenge (三元组BFS)

    题目描述: 输入输出: 输入样例: SAMPLE 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ...

随机推荐

  1. VMware Playerでの仮想マシン起動エラー

    Windows Updateすると.翌日VMware Playerの仮想マシン起動時に 「この仮想マシンを構成済み設定でパワーオンするのに十分な物理メモリがありません.」 のエラーとなることが時々あり ...

  2. Ubuntu Git安装与使用

    本系列文章由 @yhl_leo 出品.转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50760140 本文整理和归纳了关于Ub ...

  3. Java -- 新IO -- 目录

    20.1 Java 新IO简介 20.2 缓冲区与Buffer 例:演示缓冲区的操作流程 Class : IntBufferDemo01 20.2.2 深入缓冲区操作 20.2.3 创建子缓冲区 20 ...

  4. spring学习之springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序

    spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void.下面将对具体的一一进行说明: ModelAn ...

  5. express安装及使用(windows系统)

    npm install express //安装express命令 npm install express-generator -g //Express 应用生成器,通过应用生成器工具 express ...

  6. OpenGl 知识一

    写在前面 啦啦啦,搞了很久的Unity Shaders,越学越觉得基础知识很重要.学Unity Shader的时候,总会想,shader到底是什么呢?shader的pipeline是什么呢?它们是怎么 ...

  7. Netty权威指南之Netty入门程序

    package com.hjp.netty.netty; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Chan ...

  8. 【NLP】pyhanlp flask

    D:\ProgramData\Anaconda3\Lib\site-packages\pyhanlp\__init__.py 加入 WordVectorModel = LazyLoadingJClas ...

  9. UVALive - 3507 Keep the Customer Satisfied

    题意:收到n个订单,每个订单有q,d分别代表做这个的时间,和最晚的完成时间,问你最多能接受几个订单 思路:贪心,我们显然要按最早的完成时间排序,那么接下来,我们用(6,8)和(4,9)做为例子,按照我 ...

  10. windows下php使用protobuf

    1.下载protobufc https://github.com/google/protobuf/releases/download/v3.5.0/protoc-3.5.0-win32.zip解压后放 ...