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

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

最后,这道题我打了五遍以上 ,有两次被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. 【转】 Android中selector的使用

    引言 selector中文的意思选择器,在Android中常常用来作组件的背景,这样做的好处是省去了用代码控制实现组件在不同状态下不同的背景颜色或图片的变换.使用十分方便. selector的定义 s ...

  2. virtualbox+vagrant学习-4-Vagrantfile-5-Machine Settings

    Machine Settings 配置命名空间:config.vm config.vm的设置将修改vagrant管理的机器的配置 Available Settings可用设置 config.vm.ba ...

  3. 通过条件注解@Conditional细粒度的选择bean实例

    在进行spring进行开发时,当某个接口有多种实现方式并且我们只想让一种生效时,比如声明如下一个接口和两个实现: public interface LanggageService { String s ...

  4. 美团热修复Robust-源码篇

    上一篇主要分析了Robust的使用方法,这一篇就来总结一下Robust的源码分析. 我个人倾向于将Robust框架分为两个部分,自动插入代码和动态加载Patch. 一.Robust源码分析 目前我的分 ...

  5. 利用canvas将网页元素生成图片并保存在本地

    利用canvas将网页元素生成图片并保存在本地 首先引入三个文件: 1.<script type="text/javascript" src="js/html2ca ...

  6. day 84 Vue学习四之过滤器、钩子函数、路由、全家桶等

      本节目录 一 vue过滤器 二 生命周期的钩子函数 三 vue的全家桶 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 Vue的过滤器 1 moment.js 在这里我们先介绍一个 ...

  7. python2018年秋季调研

    在2018年秋季,Python软件基金会与JetBrains发起了年度Python开发者调查. 报告的目的是寻找Python领域的新趋势,帮助开发者深入了解2018年Python开发者的现状. 本报告 ...

  8. tomcat启动慢?自己动手打造轻量web服务器(一)

    废话少说,直接上代码. 编程语言:kotlin import java.net.ServerSocketimport java.net.Socket fun main(args:Array<St ...

  9. BZOJ1190_梦幻岛宝珠_KEY

    题目传送门 观察数据a*2^b,转化成二进制后,后面跟了b位的0,可以转化为一个分层背包. 先预处理出每个物品是哪一层的,并放在同层内DP. 同层内直接背包,考虑层与层之间的DP. 第一维枚举层数,然 ...

  10. Oracle数据库无法向listener注册的解决一例

    当机器的IP地址改变了,或者机器名改变后, 动态注册可能会失败. 运行 lsnrctl status时,无论等待多久,都会发生:no services 这样的信息. 此时,最好的解决方法,就是删除原有 ...