这题思路就普通的BFS加上一个维度朝向,主要是要注意输入,输出,以及细节的处理

#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std; const int MAX = 9+1;
const int DIR = 4;
const int TURN = 3;
bool have_edge[MAX][MAX][DIR][TURN];//所在位置 , 朝向 , 要走的方向 int d[MAX][MAX][DIR];//最短路径 同时可以判断结点是否访问过
#define Node(x,n) x[n.r][n.c][n.dir] struct node
{
int r , c, dir;
node(){}
node(int r, int c, int dir):r(r),c(c),dir(dir){}
}; struct node p[MAX][MAX][DIR];//父节点 打印 路径
const char *dirs = "NESW";//clockwise
const char *turns = "LFR"; inline int dir_id(char c) {return strchr(dirs,c)-dirs;}
inline int turn_id(char c) {return strchr(turns,c)-turns;} const int MAX_NAME_LEN = 42;
char MazeName[MAX_NAME_LEN];//20个字符,还有空格。。。
int r0,c0;
int r1,c1,dir1;
int r2,c2;
int dr[] = {-1, 0, 1, 0};//clockwise
int dc[] = { 0, 1, 0,-1}; bool read()
{
gets(MazeName);//lineread
// if(!strcmp(MazeName,"END")) return false;
char s[10]; int r, c;
if(!~scanf("%d%d%s",&r0,&c0,s)) return false;
printf("%s\n",MazeName);
memset(have_edge,false,sizeof(have_edge)); dir1 = dir_id(s[0]);
r1 = r0 + dr[dir1]; c1 = c0 + dc[dir1];
scanf("%d%d",&r2,&c2); while(scanf("%d",&r),r) {
scanf("%d",&c);
while(scanf("%s",s),*s != '*'){
char *p = s; int dir = dir_id(*s);//!!
while(*(++p)) { have_edge[r][c][dir][turn_id(*p)] = true;}
}
}
getchar();//吸收换行符
return true;
} void print_ans(node u)
{
vector<node> ans;
for(;;){
ans.push_back(u);
if(Node(d,u) == 0) break;
u = Node(p,u);
}
ans.push_back(node(r0,c0,dir1));
int cnt = 0;
for(int i = ans.size() - 1; i >= 0; i--){
if(cnt%10 == 0) printf(" ");
printf(" (%d,%d)", ans[i].r, ans[i].c);
if(++cnt%10 == 0) puts("");
}
if(ans.size()%10) puts("");//注意
} node walk(node &u,int turn){
int dir = u.dir;
if(turn == 0) dir = (dir + 3)%4;//rev
else if(turn == 2) dir = (dir + 1)%4;//clockwise
return node(u.r + dr[dir], u.c + dc[dir], dir );
}
inline bool inside(int r,int c) { return r > 0&&r <= 9 && c > 0 && c <= 9; } void solve()
{
queue<node> q;
node u(r1,c1,dir1);//c1 - >c2
memset(d, -1, sizeof(d));
d[u.r][u.c][u.dir] = 0;
q.push(u);
while(!q.empty()){
u = q.front();q.pop();
if(u.r == r2 && u.c == c2) { print_ans(u); return ;}
for(int i = 0; i < 3; i++) {
if(!have_edge[u.r][u.c][u.dir][i]) continue;
node v = walk(u,i);
if(inside(v.r, v.c) && d[v.r][v.c][v.dir] < 0){
d[v.r][v.c][v.dir] = Node(d,u) + 1;
Node(p,v) = u;
q.push(v);//push(u) ...
}
}
}
printf(" No Solution Possible\n");
} int main()
{
#ifdef local
freopen("in2.txt","r",stdin);
// freopen("myout.txt","w",stdout);
#endif // local
while(read()){
solve();
}
return 0;
}

  

[uva816]AbbottsRevenge Abbott的复仇(经典迷宫BFS)的更多相关文章

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

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

  2. 【OpenJ_Bailian - 2790】迷宫(bfs)

    -->迷宫  Descriptions: 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不 ...

  3. 一道很经典的 BFS 题

    一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...

  4. HDU 1372 Knight Moves(最简单也是最经典的bfs)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...

  5. ZOJ 1649 Rescue(有敌人迷宫BFS)

    题意 求迷宫中从a的位置到r的位置须要的最少时间  经过'.'方格须要1s  经过'x'方格须要两秒  '#'表示墙 因为有1s和2s两种情况  须要在基础迷宫bfs上加些推断 令到达每一个点的时间初 ...

  6. 6_14 Abbott的复仇(UVa816)<图的最短路BFS>

    1999次世界总决赛的比赛包括一个骰子迷宫问题.在这个问题被写的时候,法官们无法发现骰子迷宫概念的原始来源.不久之后的比赛,但是,罗伯特先生雅培,无数的迷宫和对作者的创造者主题,联系大赛评委,自称是骰 ...

  7. 算法入门经典第六章 例题6-14 Abbott的复仇(Abbott's Revenge)BFS算法实现

    Sample Input 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ELF * 2 3 SF ...

  8. UVa 816 Abbott的复仇(BFS)

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

  9. UVA816 Abbott's Revenge (三元组BFS)

    题目描述: 输入输出: 输入样例: SAMPLE 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ...

随机推荐

  1. JavaWeb_打包web应用war

    使用下面的语句进行打包 jar -cvf aa.war news 打包之后的文件可以直接放在tomcat的webapps里面,一旦启动tomcat,会自动解压aa.war文件.

  2. python3.5 jira网站实现用户的批量插入

    工作中,经常要给多个用户创建账号,为了减少工作量,写了个自动化脚本来帮助我批量创建用户 代码如下: """自动创建Jira的学生账号""" ...

  3. httpservlet的service()、doget()、dopost方法

    HttpServlet里的三个方法:service(HttpServletRequest req, HttpServletResponse resp) ,doGet(HttpServletReques ...

  4. Python 绘制你想要的数学函数图形

    Python 非常热门,但除非工作需要没有刻意去了解更多,直到有个函数图要绘制,想起了它.结果发现,完全用不着明白什么是编程,就可以使用它完成很多数学函数图的绘制. 通过以下两个步骤,就可以进行数学函 ...

  5. react-router-dom

    创建: 2019/05/18  安装 npm install react-router-dom --save    

  6. Unity命令行打包

    http://www.66acg.com/?post=137 补充 unity编辑器端获取打包命令行自定义参数,这个可以获取到所有打包时的参数 string[] runArgs = System.En ...

  7. cogs 2691. Sumdiv

    2691. Sumdiv ★★★   输入文件:sumdiv.in   输出文件:sumdiv.out   简单对比时间限制:1 s   内存限制:12 MB [题目描述] 考虑两个自然数A和B.定义 ...

  8. Python学习笔记(快捷键)

    增加多行缩进: Ctrl + ]  (右中括号) 减少多行缩进:Ctrl + [  (左中括号) 添加多行注释:Alt + 3 取消多行注释:Alt + 4 在Python Shell里重复上一条命令 ...

  9. Nacos深入浅出(三)

    EventDispatcher.fireEvent(new ConfigDataChangeEvent(true, dataId, group, tenant, time.getTime())); 跟 ...

  10. v$sql、v$sqlarea、v$sqltext、v$sql_plan

    转自:http://gldbhome.blog.51cto.com/1552935/886316 视图v$sqltext中没有SQL语句的相关统计信息,但是v$sqltext用多行来保存sql语句,而 ...