这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir。总体来说是一道BFS求最短路的问题。最后打印最短路的时候递归可能会导致函数栈溢出,改用循环,用vector保存路径。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>using namespace std;const int maxn = 10;struct Node
{int r, c, dir; // 走到(r,c)时的朝向dir,N~0,E~1,S~2,W~3Node(int r = 0, int c = 0, int dir = 0) :r(r), c(c), dir(dir) {}
};const char* dirs = "NESW"; // 顺时针
const char* turns = "FLR";int dirID(char c) {return strchr(dirs, c) - dirs;
} // 把方向字符转化为0~3,分别对应NESWint turnID(char c) {return strchr(turns, c) - turns;
} // 把转向字符转化为0~2,分别对应FLRint hasEdge[maxn][maxn][4][3]; // 表示当前状态是(r,c,dir)是否可以沿着转向turn行走
int d[maxn][maxn][4];
Node p[maxn][maxn][4];
int r0, c0, dir, r1, c1, r2, c2;const int dr[] = { -1, 0, 1, 0 };
const int dc[] = { 0, 1, 0, -1 };Node walk(const Node& u, int turn) {int dir = u.dir;if (turn == 1) {dir = (dir + 3) % 4; // 逆时针左转}else if (turn == 2) {dir = (dir + 1) % 4; // 顺时针右转}return Node(u.r + dr[dir], u.c + dc[dir], dir);
}bool inside(int r, int c) { // 是否出界return r >= 1 && r <= 9 && c >= 1 && c <= 9;
}bool readCase() // 读取数据
{char s[99], s2[99];scanf("%s", s);char errs[99] = "END";if (strlen(s) == 3 && s[0] == 'E' && s[1] == 'N' && s[2] == 'D') {return false;}scanf("%d%d%s%d%d", &r0, &c0, s2, &r2, &c2);printf("%s\n", s);dir = dirID(s2[0]);r1 = r0 + dr[dir];c1 = c0 + dc[dir];memset(hasEdge, 0, sizeof(hasEdge));while (1) {int r, c;scanf("%d", &r);if (r == 0) {break;}scanf("%d", &c);while (scanf("%s", s) == 1 && s[0] != '*') {for (int i = 1; i < strlen(s); i++) {hasEdge[r][c][dirID(s[0])][turnID(s[i])] = 1;}}}return true;
}void printAns(Node u) // 打印最短路
{vector<Node> nodes;while (1) {nodes.push_back(u);if (d[u.r][u.c][u.dir] == 0) {break;}u = p[u.r][u.c][u.dir];}nodes.push_back(Node(r0, c0, dir));int cnt = 0;for (int i = nodes.size() - 1; i >= 0; i--) {if (cnt % 10 == 0) {printf(" ");}printf(" (%d,%d)", nodes[i].r, nodes[i].c);if (++cnt % 10 == 0) {printf("\n");}}if (nodes.size() % 10 != 0) {printf("\n");}
}void solve()
{queue<Node> q;memset(d, -1, sizeof(d));Node u(r1, c1, dir);d[u.r][u.c][u.dir] = 0;q.push(u);while (!q.empty()) {Node u = q.front();q.pop();if (u.r == r2 && u.c == c2) { // 终点printAns(u);return;}for (int i = 0; i < 3; i++) {Node v = walk(u, i);if (hasEdge[u.r][u.c][u.dir][i] &&inside(v.r, v.c) && d[v.r][v.c][v.dir] < 0) {d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + 1;p[v.r][v.c][v.dir] = u;q.push(v);}}}printf("  No Solution Possible\n");
}int main()
{while (readCase()) {solve();}return 0;
}

Uva - 816 - Abbott's Revenge相关推荐

  1. 816 - Abbott's Revenge

    Abbott's Revenge PS:因为该题排版较麻烦,这里给出OJ网址:UVa816 - Abbott's Revenge 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点, ...

  2. UVa 816 (BFS求最短路)

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

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

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

  4. UVA816 Abbott的复仇 Abbott's Revenge(final的BFS)(真•答案)

    题目 写这道题差点没把我气死,网上的好多题解看了半天结果是假的- 题目PDF [分析] 利用队列实现广度搜索BFS来遍历图寻找最短路径. 用一个三元组(r, c, dir)表示"位于(r, ...

  5. uva 816(经典bfs例子)

    题意:有一个最多包含9*9个交叉点的迷宫 .输入起点,离开起点时的朝向和终点,求一条最短路径.每个交叉点的朝向不同能左转,右转或直走也不同.求最短路径. 分析:定义三元数组,[x][y][dir],位 ...

  6. UVa816 例题 6-14 Abbott的复仇 (Abbott's Revenge,ACM/ICPC World Finals 2000)

    原题链接: UVa-816 题目大意: 模有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求一条最短路径.(具体题目参考原题和紫书) 解题思路: 本题是一道用BFS求最短路径的迷 ...

  7. uva816 Abbott's Revenge (BFS+回溯)

    题目大意 给你个迷宫,求最短路,不过在每个点转弯的方向受进入方向的限制 思路 确定好每个点的状态,再用bfd求出最短路,注意记得用个数组保存节点,以方便输出 事实上很多细节都是参考刘汝佳老师的,感觉非 ...

  8. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  9. 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 习题(12/14)

    文章目录 说明 习题 习6-1 UVA 673 平衡的括号 习6-2 UVA 712 S - 树 习6-3 UVA 536 二叉树重建 习6-4 UVA 439 骑士的移动 习6-5 UVA 1600 ...

  10. 算法竞赛入门竞赛 入门经典 第六章 个人记录

    UVa 210 并行程序模拟(放弃 || 待补) 没看懂题意,但是有百度了一下duque 算是对duque有了一个大致的认识和了解 当然也有尝试. 本来想着去hdu找一些duque的题 结果 好像可以 ...

最新文章

  1. 【转】CSS 与 HTML5 响应式图片
  2. 常见问题—打包压缩问题
  3. ios无痕埋点_移动端无痕埋点实践详解(二)
  4. 张秋余---经典语录
  5. 厂商 push 不通排查指南
  6. windows怎么将图片变为单色图片_印刷丨单色黑与四色黑
  7. 在SQL Server中取得操作系统文件的最后修改日期 [Z]
  8. 首席翻译的英语学习方法
  9. 【汇编程序】实现1-100求和(使用LOOP循环)
  10. 查询正在使用的用户(删除用户时)
  11. java+mysql 基于ssm的高校毕业生就业管理系统
  12. 小程序中wx-if使用方法
  13. Java实验—四子棋进阶
  14. c语言文件分割与合并
  15. 神舟笔记本WLAN打不开的解决方法
  16. wps表格保存html,网页中的数据怎么导入excel表格数据-怎么把网页数据导入到wps表格中...
  17. 给一个数组[a1,a2,a3....an],要求出令ai-aj有最大值,其中i<=j,时间复杂度尽可能小 ```
  18. 一些关于三角函数的公式
  19. 使用VIVADO中的MIG控制DDR3(AXI接口)四——MIG配置及DDR3读写测试
  20. org.hibernate.PropertyNotFoundException: Could not find a setter for id in XXX

热门文章

  1. 转:《欢聚时代(多玩YY)IPO招股书》(概要)
  2. 计算机网络之验证性实验(tracert+ARP)
  3. 数据结构(python语言描述)第一章
  4. 西门子触摸屏HTML控件,西门子HMI触摸屏操作手册.pdf
  5. 通用网络版本md5算法和.net中md5算法接轨
  6. 怎么控制人物行走动画与移动
  7. 前端下载音频的两种处理方式
  8. Teamtalk线程池
  9. CEFSharp崩溃分析及解决办法
  10. java api接口签名验证失败_简单API接口签名验证