紫书的这道题, 作者说是很重要。

但看着题解好长, 加上那段时间有别的事, 磨了几天没有动手。

最后,这道题我打了五遍以上 ,有两次被BUG卡了,找了很久才找到。

思路紫书上有,就缺少输入和边界判断两个部分。不是因为紫书,应该也不会找到这个WF题吧,所以其余思路就不说了。 一些注释在代码中有。

代码:

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; const int MAXN = ;
const char* dirs = "NESW";
const char* turns = "FLR";
int dir_id(char c) {return strchr(dirs, c)-dirs;}
int turn_id(char c) {return strchr(turns, c)-turns;}
const int dr[] = {-, , , };
const int dc[] = {, , , -}; struct Node
{
int r;
int c;
int dir;
Node(int rr=, int cc=, int d=):r(rr), c(cc), dir(d) {}
}; int has_edge[MAXN][MAXN][][];
int d[MAXN][MAXN][];//判断是否遍历过
Node p[MAXN][MAXN][];
int r0, c0, r1, c1, r2, c2, dir; Node walk(const Node& u, int turn)
{
int dir=u.dir;
if(turn==) dir = (dir+)%;//逆时针
if(turn==) dir = (dir+)%;//顺时针
return Node(u.r+dr[dir], u.c+dc[dir], dir);
} bool inside(int r, int c)//判断是否出界
{
return r>= && r<= && c>= && c<=;
} bool read_case()
{
char s1[], s2[];//储存名字, 储存方向
if(scanf("%s%d%d%s%d%d", s1, &r0, &c0, s2, &r2, &c2)!=) return false;//输入不正确
printf("%s\n", s1);
memset(has_edge, , sizeof(has_edge)); dir = dir_id(s2[]);
r1 = r0+dr[dir];
c1 = c0+dc[dir]; for(; ;)
{
int r, c;
scanf("%d", &r);
if(r==) break;
scanf("%d", &c);
while(scanf("%s", s2)== && s2[]!='*')
{
int len=strlen(s2);
for(int i=; i<len; i++)
has_edge[r][c][dir_id(s2[])][turn_id(s2[i])]=;//将可走的地方赋1
}
}
return true;
} void print_ans(Node u)
{
vector<Node> nodes;
for(; ;)//输入
{
nodes.push_back(u);
if(d[u.r][u.c][u.dir]==) break;
u = p[u.r][u.c][u.dir];
}
nodes.push_back(Node(r0, c0, dir));//起点存入 int cnt=;
for(int i=nodes.size()-; i>=; i--)//倒着输出
{
// cout<<"#i"<<endl;
if(cnt% == ) printf(" ");
printf(" (%d,%d)", nodes[i].r, nodes[i].c);
if(++cnt % ==) printf("\n");
}
if(nodes.size()%!=) printf("\n");
} void solve()
{
queue<Node> q;
memset(d, -, sizeof(d));
Node u(r1, c1, dir);
d[u.r][u.c][u.dir]=;
q.push(u);
while(!q.empty())
{
Node now = q.front(); q.pop();
if(now.r==r2 && now.c==c2)
{
print_ans(now);
return;
} for(int i=; i<; i++)
{
Node v = walk(now, i);
if(has_edge[now.r][now.c][now.dir][i] && d[v.r][v.c][v.dir]< && inside(v.r, v.c))
{
d[v.r][v.c][v.dir] = d[now.r][now.c][now.dir]+;
p[v.r][v.c][v.dir] = now;
q.push(v);
}
}
}
printf(" No Solution Possible\n");
} int main()
{
while(read_case())
solve(); return ;
}

毕竟完成了一题WF题,虽然开始的思路不是自己想的,但还是感觉有一丝丝成就感,哈哈。

UVA 816 Abbott's Revenge 紫书的更多相关文章

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

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

  2. UVA 816 Abbott’s Revenge

    bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的 ...

  3. uva 816 abbott's revenge ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r

  4. Uva - 816 - Abbott's Revenge

    这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印 ...

  5. Uva 816 Abbott's Revenge(BFS)

    #include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...

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

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

  7. UVA 816 - Abbott&#39;s Revenge(BFS)

    UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=59 ...

  8. uva 816 Abbott的复仇

    题目链接:https://uva.onlinejudge.org/external/8/816.pdf 紫书:P165 题意: 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求 ...

  9. UVa 11582 Colossal Fibonacci Numbers! 紫书

    思路是按紫书上说的来. 参考了:https://blog.csdn.net/qwsin/article/details/51834161  的代码: #include <cstdio> # ...

随机推荐

  1. package结构

    1.package结构 一个package下常见的文件. 路径有:├── CMakeLists.txt #package的编译规则(必须)├── package.xml #package的描述信息(必 ...

  2. PAT乙级1012

    1012 数字分类 (20 分)   给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A​1​​ = 能被 5 整除的数字中所有偶数的和: A​2​​ = 将被 5 除后余 1 的 ...

  3. 支持xhr浏览器:超时设定、加载事件、进度事件

    各个浏览器虽然都支持xhr,但还是有些差异. 1.超时设定 IE8为xhr对象添加了一个timeout属性,表示请求在等待响应多少毫秒后就终止.再给timeout这只一个数值后,如果在规定的时间内浏览 ...

  4. Jmeter之集合点与关联

    在Jmeter中,实现类似于LoadRunner中集合点的方法是采用同步定时器(Synchronizing Timer),而实现类似于LoadRunner中关联的方法是采用正则表达式提取器. 一.集合 ...

  5. HDU 1754 I Hate It(线段树之单点更新 区间最值查询)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. tcpdump 和 wireshark 的实用例子

    tcpdump: 1.用 tcpdump 截取本机 ip 10.2.1.2 10050 端口的包 tcpdump -nnv  -i eth0 host 10.2.1.2 and port 10050 ...

  7. jQuery----each()方法

    jquery中有隐式迭代,不需要我们再次对某些元素进行操作.但是如果涉及到不同元素有不同操作,需要进行each遍历.本文利用10个li设置不同的透明度的案例,对each方法进行说明. 语法: $(元素 ...

  8. 【转】CSDN离线网页html文件自动跳转

    问题: 最近使用OneNote2016剪辑csdn的文章时,发现一些公式/文本框不能被正确识别,所以离线保存网页的html文件. 但是每次打开html文件,都会自动跳转的CSDN主页,即使断网,也会自 ...

  9. Hibernate第四天——查询方式

    Hibernate入门最后一天第四天,我们进行查询方式的更进一步的细化: 先看一下大致的Hibernate的提供的查询的方式: 1.对象导航查询 2.OID查询 3.HQL查询 4.QBC查询 5.本 ...

  10. 20155327实验一 Java开发环境的熟悉

    20155327实验一 Java开发环境的熟悉 实验内容 1.使用JDK编译.运行简单的java程序 2.使用IDEA编辑.编译.运行.调试java程序 实验步骤 1.使用JDK编译.运行简单的jav ...