[uva816]AbbottsRevenge Abbott的复仇(经典迷宫BFS)
这题思路就普通的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)的更多相关文章
- Uva 816 Abbott的复仇(三元组BFS + 路径还原)
题意: 有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出. 分析: 因为多了朝向这个元素, 所以我们bfs的队列元素就是一个三元组(r,c,dir ...
- 【OpenJ_Bailian - 2790】迷宫(bfs)
-->迷宫 Descriptions: 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不 ...
- 一道很经典的 BFS 题
一道很经典的 BFS 题 想认真的写篇题解. 题目来自:https://www.luogu.org/problemnew/show/P1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运 ...
- HDU 1372 Knight Moves(最简单也是最经典的bfs)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1372 Knight Moves Time Limit: 2000/1000 MS (Java/Othe ...
- ZOJ 1649 Rescue(有敌人迷宫BFS)
题意 求迷宫中从a的位置到r的位置须要的最少时间 经过'.'方格须要1s 经过'x'方格须要两秒 '#'表示墙 因为有1s和2s两种情况 须要在基础迷宫bfs上加些推断 令到达每一个点的时间初 ...
- 6_14 Abbott的复仇(UVa816)<图的最短路BFS>
1999次世界总决赛的比赛包括一个骰子迷宫问题.在这个问题被写的时候,法官们无法发现骰子迷宫概念的原始来源.不久之后的比赛,但是,罗伯特先生雅培,无数的迷宫和对作者的创造者主题,联系大赛评委,自称是骰 ...
- 算法入门经典第六章 例题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 ...
- UVa 816 Abbott的复仇(BFS)
寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多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 ...
随机推荐
- php+redis实现高并发模拟下单、秒杀、抢购操作
对于高并发下的场景,一般都是采用redis缓存机制来处理. 当然也不是只有redis可以处理.还有利用mysql事务操作锁住操作的行.文件锁. 不过这些方式都没有redis缓存高效.可靠. 模拟的过程 ...
- malloc,alloc,realloc之间的相似与区别
三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(si ...
- [Xcode 实际操作]六、媒体与动画-(9)使用CATransaction Push制作入场动画
目录:[Swift]Xcode实际操作 本文将演示如何制作入场动画. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class View ...
- 原生js 的ajax封装
/** * 封装ajax函数(包括跨域) * @method ajax * @param option :{type:"post" or "get" 请求方式, ...
- 洛谷P1002 过河卒
关于蒟蒻的我,刚刚接触DP.... 那么就来做一道简单DP吧.... 首先先看题: 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一 ...
- IOS 打包提示 No iTunes Connect access for the team
1.可以在提示页直接点击 Manage Accounts按钮,进去页面后,选择开发者账号点减号删除:(或者在Xcode中直接按command+键进入,选择accounts,选中账号按-键删除) 2.完 ...
- this真题编译
1 x y z分别输出的是什么? var x=1, y=z=0; function add(n){ return n= n+1; }; y=add(x); function add(n){ retu ...
- python3的encode()和decode()
python3的encode()和decode() 在python3的内存中. 在程序运行阶段. 使⽤用的是unicode编码. 因为unicode是万国码. 什么内容都可以进行显示. 那么在数据传输 ...
- bzoj1095: [ZJOI2007]Hide 捉迷藏 动态点分治学习
好迷啊...感觉动态点分治就是个玄学,蜜汁把树的深度缩到logn (静态)点分治大概是递归的时候分类讨论: 1.答案经过当前点,暴力(雾)算 2.答案不经过当前点,继续递归 由于原树可以长的奇形怪状( ...
- is null 的优化
bk1gx7xwj9du6SELECT * FROM HEADERS GJH WHERE ATTRIBUTE10 IS NULL FOR UPDATE 优化建议如下: 短期来说:建立一个索引来优化: ...