题目链接:https://uva.onlinejudge.org/external/8/816.pdf

紫书:P165

题意:

有一个最多包含9*9个交叉点的迷宫。输入起点、离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可)。

分析:

BFS的结点对状态转移的影响的因素有哪些,那么这个结点就要包含哪些信息。

左右,和东南西北的转换。

首先规定东南西北的顺时针。根据左右转向求出下一个方位。

下一个节点的坐标是有当前位置,和下一个状态的方向决定。

图的构建也是根据对结点状态转移的影响建图的。 has_edge[r][c][dir][turn] ,当前状态(r,c,dir)向 turn 方向走是否有路。

#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) {}
}; const int Maxn = ;
const char* dirs = "NESW";
const char* turns = "FLR"; int dir_id(char c)
{
return strchr(dirs,c) - dirs;
} int turn_id(int c)
{
return strchr(turns,c) - turns;
} const int dr[] = {-,,,};
const int dc[] = {,,,-}; 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)
{
if(r>=&&r<=&&c>=&&c<=)
return true;
else return false;
} int has_edge[Maxn][Maxn][][];
int r0,c0,r1,c1,r2,c2,dir;
bool read()
{
char s[],s2[];
if(scanf("%s%d%d%s%d%d",s,&r0,&c0,s2,&r2,&c2)!=) return false; puts(s);
dir = dir_id(s2[]);
r1 = r0 + dr[dir];
c1 = c0 + dc[dir]; memset(has_edge,,sizeof(has_edge));
for(;;)
{
int r,c;
scanf("%d",&r);
if(r==) break;
scanf("%d",&c); while(scanf("%s",s)==&&s[]!='*')
{ for(int i=; i<strlen(s); i++)
{
has_edge[r][c][dir_id(s[])][turn_id(s[i])] = ;
}
} }
return true; } int d[Maxn][Maxn][];
Node p[Maxn][Maxn][]; 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--)
{
if(cnt%==) printf(" ");
printf(" (%d,%d)",nodes[i].r,nodes[i].c);
cnt++;
if(cnt%==) printf("\n"); }
if(nodes.size()%!=) puts("");
} void bfs()
{
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 u = q.front();
q.pop();
if(u.r == r2 && u.c == c2)
{
print_ans(u);
return;
}
for(int i = ; i < ; i++)
{
Node v = walk(u, i);
if(has_edge[u.r][u.c][u.dir][i] && 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] + ;
p[v.r][v.c][v.dir] = u;
q.push(v);
}
}
}
printf(" No Solution Possible\n");
} int main()
{
while(read())
{
bfs();
}
return ;
}

uva 816 Abbott的复仇的更多相关文章

  1. UVa 816 Abbott的复仇(BFS)

    寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同, ...

  2. Uva 816 Abbott的复仇(三元组BFS + 路径还原)

    题意: 有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出. 分析: 因为多了朝向这个元素, 所以我们bfs的队列元素就是一个三元组(r,c,dir ...

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

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

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

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

  5. uva 816 abbott's revenge ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r

  6. UVA 816 Abbott’s Revenge

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

  7. uva 816 - Abbott&#39;s Revenge(有点困难bfs迷宫称号)

    是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...

  8. Uva - 816 - Abbott's Revenge

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

  9. Uva 816 Abbott's Revenge(BFS)

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

随机推荐

  1. 为什么要在block用weak self

    block会给内部所有的对象引用计数加一,这一方面会带来潜在的retain cycle,不过我们可以通过Weak Self的手段解决.另一方面比较重要就是,它会延长对象的生命周期. 在block前面写 ...

  2. ORACLE数据库创建用户名和表空间

    [sql] /*第1步:登录  */  以sys/sys超级用户登录pl/sql      /*第2步:创建临时表空间  */  create temporary tablespace user_te ...

  3. Codeforce Round #215 Div2 C

    还以为就这么点分了,不会跪了,起码有点加,生活都这么艰难了,为什么不让我好好地活下去! 是不是世界对我充满了恶意! 当然还是自己太菜! B题没初始化第一个就杯具了一次 C题大概的弄出来了,调了半个小时 ...

  4. 在数组中搜索数据用 filteredArrayUsingPredicate

    苹果官方说明文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/ ...

  5. [转]WEB开发者必备的7个JavaScript函数

    我记得数年前,只要我们编写JavaScript,都必须用到几个常用的函数,比如,addEventListener 和 attachEvent,并不是为了很超前的技术和功能,只是一些基本的任务,原因是各 ...

  6. 详细介绍dll文件是什么

     DLL是Dynamic Link Library的缩写,意为动态链接库.DLL文件一般被存放在C:WindowsSystem目录下.DLL是一个包含可由多个程序同时使用的代码和数据的库. 在Wind ...

  7. ef 5 在 DropCreateDatabaseAlways 报错,the connection is currently used

    go sp_who2 -- db_id 数据库名称,查询出来的结果执行一遍就能关闭所有连接 SELECT N'kill '+ CAST(spid AS varchar) FROM master..sy ...

  8. 去掉list重复值

    /** * 去掉list重复值 */ public List<String> removeDuplicate(List<String> list) { HashSet<S ...

  9. Linux mail 命令参数

    linux mail 命令参数: 使用mail发邮件时,必须先将sendmail服务启动. mail –s “邮件主题” –c”抄送地址” –b “密送地址” -- -f 发送人邮件地址 –F 发件人 ...

  10. mybatis(二)执行CRUD操作的两种方式配置和注解

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...