UVa 816 Abbott的复仇(BFS)】的更多相关文章

 UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉点的方向(用NEWS表示不同方向)不同时, 允许出去的方向也不相同. 例如:1 2 WLF NR ER * 表示如果 进去时朝W(左), 可以 左转(L)或直行(F), 如果 朝N只能右转(R) 如果朝E也只能右转.* 表示这个点的描述结束啦! 输入有: 起点的坐标, 朝向, 终点的坐标.然后是各个…
寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同,允许出去的方向也不同.所以在记录迷宫的时候比较麻烦,可以用一个四元组has_edge[10][10][4][4]来记录,前两个元素代表坐标点,第三个元素代表进入该点时的方向,第四个元素代表离开该点时的方向.在BFS遍历时还是和以前的题目差不多的,记录好路径,最后回溯输出就行. 我还犯了个小错误,因为…
题意: 有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出. 分析: 因为多了朝向这个元素, 所以我们bfs的队列元素就是一个三元组(r,c,dir),然后做好输入处理的细节, 这题的关键在于bfs中的路径还原. 其实bfs的过程就是一棵树,如下图 除了起点外, 每个点都有且只有一个父亲节点, 那么我们只需要开一个pre数组来记录每个点的父亲, 找到终点后从终点往上不断找父亲节点, 直到找到父亲节点, 那么就完成了路径还原的 步骤. #incl…
题目链接:https://uva.onlinejudge.org/external/8/816.pdf 紫书:P165 题意: 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可). 分析: BFS的结点对状态转移的影响的因素有哪些,那么这个结点就要包含哪些信息. 左右,和东南西北的转换. 首先规定东南西北的顺时针.根据左右转向求出下一个方位. 下一个节点的坐标是有当前位置,和下一个状态的方向决定. 图的构建也是根据对结点状态转移的影响建图…
#include<cstdio> #include<cstring> #include<vector> #include<queue> using namespace std; struct Node { int row,col,dir; Node(,,):row(row),col(col),dir(dir) {} }; const char * dirs="NESW"; const char * turns="FLR"…
UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=599&problem=757&mosmsg=Submission+received+with+ID+14332151" target="_blank" style="">题目链接 题意:一个迷宫,每一个点限制了从哪一方向来的.仅仅能往左右前…
是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<iostream> #include<algorithm> using namespace std; struct note {…
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的下一个点当做初始状态 注意理解题意:进入交叉点的朝向与从哪个方向进交叉点正好相反 #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #i…
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r…
bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的上一个结点是确定的!) ps:输出因为太懒不想处理所以按书上打的:递归打印理解有点麻烦... #include <iostream> #include <cstring> #include <algorithm> #include <queue> #includ…
这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印最短路的时候递归可能会导致函数栈溢出,改用循环,用vector保存路径. AC代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cctype> #include <…
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r…
紫书的这道题, 作者说是很重要. 但看着题解好长, 加上那段时间有别的事, 磨了几天没有动手. 最后,这道题我打了五遍以上 ,有两次被BUG卡了,找了很久才找到. 思路紫书上有,就缺少输入和边界判断两个部分.不是因为紫书,应该也不会找到这个WF题吧,所以其余思路就不说了. 一些注释在代码中有. 代码: #include <cstdio> #include <iostream> #include <cstring> #include <vector> #inc…
/*816 - Abbott's Revenge ---代码完全参考刘汝佳算法入门经典 ---strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:char * strchr (const char *str, int c) ---BFS求最短路 --*/ #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #include<string.h> #include<queue> #include<al…
题目链接:https://vjudge.net/problem/UVA-816 题目大意: 有一个最多包含9*9 个交叉点的迷宫.输入起点,离开起点时的朝向和终点,求一条最短路(多解时任意输出 一个即可) 思路:  这个迷宫的特殊之处其实就两点,一是朝向会影响往哪走,而是要记录走的路径. 所以我们要解决这两个难点: 朝向  :我们可以给数组再加一个朝向 来标记是否访问过 记录路径:可以 记录当前节点的父亲节点,注意当前节点是加 了朝向的当前节点 这是写过的第一道要输出路径的题目,很重用!!! 看…
题意:一个迷宫,每个交叉路口有一路标,限制了你从某方向进入该路口所能进入的路口. 题解:1.对于方向的处理:将node多增加一维dir,通过一个const 字符数组 加 上dir_id函数 以及一个方向数组 快速完成从读取字母到模拟路口限制的转换. 2.用一个四位数组记录某节点某方向是否能走,     3.对于路径的记录,用node p[] 记录当前节点的前一个节点,然后将其中的元素push到一个vector里面再输出. 坑:1.no possible input 多了个空格(紫书上没有前缀空格…
一开始情况没有考虑周全,直接WA掉了, 然后用fgets()出现了WA,给改成scanf就AC了 题目不是很难,用心就好…… #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <cstdlib> #include <stack> #include <cctype…
本题的题意是输入起点,朝向和终点,求一条最短路径(多解时任意输出一个即可) 本题的主要代码是bfs求解,就是以下代码中的slove的主要部分,通过起点按照路径的长度来寻找最短路径,输出最先到终点的一系列点 以下代码中,用两个数组保存四个方向,运用函数walk()表示结点的方向变换,通过d[][][]保存路径的长度,p[][][]保存路径中的结点,has_edge[][][][]标记行得通的路径,同时用队列先进先出,层次遍历所有结点,用vector存储将要输出的结点,防止内存空间不够大 #incl…
算法入门经典上面的题.题目链接 uva816 大致题意 有一个最多包含9*9个交叉点的迷宫.输入起点.离开起点时的朝向和终点,求一条最短路(多解时任意输出一个即可).详细题意请看原题 思路 其实就是bfs,但是难点在于转向,将四个方向和3种转弯方式编号为0~3和0~2. 下面是转弯函数的实现 const char *dirs="NESW"; const char *turns="FLR"; int dir_id(char c) { return strchr(dir…
这题思路就普通的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];//所在位置…
1999次世界总决赛的比赛包括一个骰子迷宫问题.在这个问题被写的时候,法官们无法发现骰子迷宫概念的原始来源.不久之后的比赛,但是,罗伯特先生雅培,无数的迷宫和对作者的创造者主题,联系大赛评委,自称是骰子迷宫的鼻祖.很遗憾,我们没有信用艾伯特他原来的概念在去年的问题陈述.但是我们很高兴地报告,Abbott先生提供了自己的专业知识,这一年他的原创大赛未穿过箭头迷宫.例如大多数的迷宫,走过迷宫是被箭从交叉路口直到达到目标路口.由于每个路口从一个给定的方向接近,靠近路口的一个标志指示在哪个方向的交叉点可…
题意: 给出一个迷宫,在迷宫的节点处,面向某个方向只能向给定的方向转弯.给出起点和终点输出迷宫的最短路径,这里指的是刚刚离开起点的时刻,所以即使起点和终点重合路径也非空. 分析: 用三个变量来表示状态,r,c,dir,分别代表所处的位置和朝向.在输入数据的同时,也要初始化has_edge[r][c][dir][turn],代表处于(r, c, dir)这个状态时能否向turn转弯. 结构体数组p用来保存路径. 因为路径可能比较长,所以如果采用地轨输出的话,可能会栈溢出.代码中采用了动态数组来输出…
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 SFR EL * 0 Sample Output (3,1) (2,1) (1,1) (1,2) (2,2) (2,3) (1,3) (1,2) (1,1) (2,1) (2,2) (1,2) (1,3) (2,3) (3,3) 析 题目的大意是,输入起点,离开起点时的朝向和终点,求一条最短路. 每一个…
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624.pdf <训练指南>P307 分析:只需要预处理每个格子起火的时间,在BFS扩展节点的时候加一个判断,到达该节点的时候,格子没有起火. 写法很巧妙,两次BFS类似,数据加一维kind,表示Joe到达该点和火到达该点. #include <bits/stdc++.h> using nam…
题目给出一个后缀表达式,让你求从下往上的层次遍历. 思路:结构体建树,然后用数组进行BFS进行层次遍历,最后把数组倒着输出就行了. uva过了,poj老是超时,郁闷. 代码: #include <cstdio> #include <cstring> #include <cstdlib> const int maxn = 10001; char str[maxn]; int p; struct Node { char data; Node* l; Node* r; };…
UVA 810 - A Dicey Problem 题目链接 题意:一个骰子,给你顶面和前面.在一个起点,每次能移动到周围4格,为-1,或顶面和该位置数字一样,那么问题来了,骰子能不能走一圈回到原地,输出路径,要求最短,假设有多个最短,依照上下左右输出 思路:读懂题就是水题,就记忆化搜一下就可以,记录状态为位置和骰子顶面.正面(由于有两面就能确定骰子了) 代码: #include <cstdio> #include <cstring> #include <vector>…
UVA 11573 - Ocean Currents 题目链接 题意:给定一个海面.数字分别代表海流方向,顺着海流不用费能量,逆海流要费1点能量,每次询问给一个起点一个终点,问起点到终点耗费的最小能量 思路:广搜.队列用优先队列,每次取能量最低的点出来进行状态的转移 代码: #include <cstdio> #include <cstring> #include <queue> using namespace std; const int d[8][2] = {{-1…
算法指南白书 维护一个四维数组,走一步更新一步 #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; ; + ; + ; int R, C, sr, sc, tr, tc; char maze[maxr][maxc]; struct State { int r, c, dir, color; State(int r, int c,…
先对火BFS一次,求出每个点的最小着火时间. 再对人BFS一次,求出走到边界的最少时间. #include <iostream> #include <queue> #include <cstring> using namespace std; int n,m,bz[1005][1005],qihuo[1005][1005]; char map[1005][1005]; int h[4][2]={-1,0,1,0,0,-1,0,1}; struct point { int…
题目大意:给出一个方格矩阵,矩阵中有数字0~9,任选一个格子为起点,将走过的数字连起来构成一个数,找出最大的那个数,每个格子只能走一次. 题目分析:DFS.剪枝方案:在当前的处境下,找出所有还能到达的点的个数,若当前数字的长度加上个数仍小于目前最优答案的长度,则剪去:若长度相等,则将所有还能到达的数字按从大到小排序后连到当前数字上,如果还比目前最优解小,则减去.找出所有还能到达的点的过程用BFS实现. #pragma comment(linker, "/STACK:1024000000,1024…