Uva 816 Abbott的复仇(三元组BFS + 路径还原)
题意:
有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出。

分析:
因为多了朝向这个元素, 所以我们bfs的队列元素就是一个三元组(r,c,dir),然后做好输入处理的细节, 这题的关键在于bfs中的路径还原。
其实bfs的过程就是一棵树,如下图

除了起点外, 每个点都有且只有一个父亲节点, 那么我们只需要开一个pre数组来记录每个点的父亲, 找到终点后从终点往上不断找父亲节点, 直到找到父亲节点, 那么就完成了路径还原的
步骤。
#include <bits/stdc++.h>
using namespace std;
struct Node{
int r,c,dir;
Node(int r=, int c=, int dir=):r(r),c(c),dir(dir) {}
}; int have_edge[][][][];
int d[][][];
Node pre[][][];
int r0,c0,r1,c1,rf,cf,init_dir;
const char* dirs = "NESW"; //
const char* turns = "FLR";//0不动 1左 顺时针 2右 逆时针 int id_dir(char s){ return strchr(dirs,s) - dirs;}
int id_turn(char s){return strchr(turns,s) - turns;} const int dr[] = {-, , , }; //dirs为上右下左
const int dc[] = {, , , -}; bool input(){
char s1[], s2[];
int o;
if((o = scanf("%s%d%d%s%d%d",s1,&r0,&c0,s2,&rf,&cf) )!= ) { return false;}
printf("%s\n", s1);
init_dir = id_dir(s2[]);
r1 = r0 + dr[init_dir];
c1 = c0 + dc[init_dir];
// printf("%d %d %d\n", init_dir,r1,c1);
memset(have_edge,,sizeof(have_edge));
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++){
have_edge[r][c][id_dir(s2[])][id_turn(s2[i])] = ;
}
}
}
return true;
}
Node walk(const Node& u, int turn){
int dir = u.dir;
if(turn == ) dir = (u.dir+)%;
else if(turn == ) dir = (u.dir+) %;
return Node(u.r + dr[dir], u.c + dc[dir] , dir);
} bool inside(int r, int c) {
return r >= && r <= && c >= && c <= ;
}
void print_ans(Node u){
vector<Node> ans;
for(;;){
ans.push_back(u);
if(d[u.r][u.c][u.dir] == )
break;
u = pre[u.r][u.c][u.dir];
}
ans.push_back(Node(r0,c0,init_dir)); int cnt = ;
for(int i = ans.size() -; i >= ; i--){
if(cnt % == ) printf(" ");
printf(" (%d,%d)", ans[i].r, ans[i].c);
if(++cnt % == ) printf("\n");
}
if(ans.size() % != ) printf("\n");
}
void solve(){
queue<Node> q;
memset(d,-,sizeof(d));
d[r1][c1][init_dir] = ;
Node u(r1,c1,init_dir);
q.push(u);
while(!q.empty()){
Node u = q.front(); q.pop();
// printf("$ u %d %d %d\n",u.r, u.c,u.dir);
if(u.r == rf && u.c == cf){
print_ans(u);
return;
}
for(int i = ; i < ; i++){
Node v;
if(have_edge[u.r][u.c][u.dir][i])
v = walk(u,i);
// printf("& v %d %d %d\n",v.r, v.c, v.dir);
if(inside(v.r,v.c) && d[v.r][v.c][v.dir] < ){
d[v.r][v.c][v.dir] = d[u.r][u.c][u.dir] + ;
pre[v.r][v.c][v.dir] = u;
q.push(v);
}
}
}
printf(" No Solution Possible\n");
}
int main(){
while(input()){
solve();
}
return ;
}
Uva 816 Abbott的复仇(三元组BFS + 路径还原)的更多相关文章
- UVa 816 Abbott的复仇(BFS)
寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同, ...
- uva 816 Abbott的复仇
题目链接:https://uva.onlinejudge.org/external/8/816.pdf 紫书:P165 题意: 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求 ...
- UVA - 816 Abbott's Revenge(bfs)
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- UVA 816 - Abbott's Revenge(BFS)
UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=59 ...
- POJ-3894 迷宫问题 (BFS+路径还原)
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...
- uva 816 - Abbott's Revenge(有点困难bfs迷宫称号)
是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...
- Uva 816 Abbott's Revenge(BFS)
#include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...
- UVA 816 Abbott’s Revenge
bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的 ...
随机推荐
- Android属性动画ObjectAnimator的使用1
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/106 属性动画ObjectAnimator的使用 属性动画 ...
- 进击的Python【第十六章】:Web前端基础之jQuery
进击的Python[第十六章]:Web前端基础之jQuery 一.什么是 jQuery ? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多&quo ...
- _bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 见一周目记录:http://www.cnblogs.com/ciao-sora/p/6 ...
- 16-2 基于localStorage或sessionStorage的计数器
localStorage 方法 localStorage 方法存储的数据没有时间限制.第二天.第二周或下一年之后,数据依然可用. <!doctype html> <html> ...
- 转 SQL*PLUS中的替换变量(& &&)
今天oracle support提供一个脚本,大致如下: PROMPT ROUTING_SEQUENCE_ID = &ROUT_SEQ_ID PROMPT OPERATION_SEQUENCE ...
- SpringCloud开发学习总结(七)—— 声明式服务调用Feign(一)
在实践的过程中,我们会发现在微服务架构中实现客户端负载均衡的服务调用技术Spring Cloud Ribbon<SpringCloud开发学习总结(四)—— 客户端负载均衡Ribbon> ...
- Suricata的所有运行方式模式(图文详解)
不多说,直接上干货! suricata的基本组成.Suricata是由所谓的线程(threads).线程模块 (thread-modules)和队列(queues)组成.Suricata是一个多线程的 ...
- 在spring boot 中使用itext和itextrender生成pdf文件
转载请注明出处 https://www.cnblogs.com/majianming/p/9539376.html 项目中需要对订单生成pdf文件,在第一版本其实已经有了比较满意的pdf文档,但是还是 ...
- [转]Sorting, Filtering, and Paging with the Entity Framework in an ASP.NET MVC Application (3 of 10)
本文转自:http://www.asp.net/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/sorting-fi ...
- 波哥!一个不安分的IT男
第一篇博文,紧张,窃喜,辣眼睛! 这个订阅号主要是写给自己的,近期越来越发现记忆力不如以前了! 时光如梭,岁月荏苒,或许这两句经典的开头文比较契合自己的年纪.依稀记得几年前还在组装服务器.搬机柜.做系 ...