UVA - 816 Abbott's Revenge(bfs)
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路。
分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的下一个点当做初始状态
注意理解题意:进入交叉点的朝向与从哪个方向进交叉点正好相反
#pragma comment(linker, "/STACK:102400000, 102400000")
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define Min(a, b) ((a < b) ? a : b)
#define Max(a, b) ((a < b) ? b : a)
typedef long long ll;
typedef unsigned long long llu;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const ll LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {, , , -};
const int dc[] = {, , -, };
const int MOD = 1e9 + ;
const double pi = acos(-1.0);
const double eps = 1e-;
const int MAXN = + ;
const int MAXT = + ;
using namespace std;
char s[];
bool edge[][][][];
int dis[][][];
const char* a = "ESWN";//与数组dr,dc方向对应
const char* b = "LFR";
struct Node{
int x, y, d;//当前点的坐标,及进入该点的朝向
Node(){}
Node(int xx, int yy, int dd):x(xx), y(yy), d(dd){}
}num[][][];//记录该点的上一个点
int dir_id(char c){
return strchr(a, c) - a;
}
int turn_id(char c){
return strchr(b, c) - b;
}
bool judge(int x, int y){
return x >= && x <= && y >= && y <= ;
}
Node next(const Node&t, int turn){//turn与字符数组b下标对应
int dir = t.d;//向前走朝向不变
if(!turn){//向左走
dir = (dir + ) % ;//减1等价于加3
}
else if(turn == ){
dir = (dir + ) % ;
}
return Node(t.x + dr[dir], t.y + dc[dir], dir);
}
void print_ans(Node t, int tx, int ty, int dir){
stack<Node> st;
while(){
st.push(t);
if(dis[t.x][t.y][t.d] == ) break;
t = num[t.x][t.y][t.d];
}
st.push(Node(tx, ty, dir));
int cnt = ;
while(!st.empty()){
Node tmp = st.top();
st.pop();
++cnt;
if(cnt % == ) printf(" ");
printf(" (%d,%d)", tmp.x, tmp.y);
if(cnt % == ) printf("\n");
}
if(cnt % != ) printf("\n");
}
bool bfs(int sx, int sy, int dir, int ex, int ey){
memset(dis, -, sizeof dis);
queue<Node> q;
q.push(Node(sx, sy, dir));
dis[sx][sy][dir] = ;
int tx = sx - dr[dir];//迷宫起点
int ty = sy - dc[dir];
while(!q.empty()){
Node t = q.front();
q.pop();
if(t.x == ex && t.y == ey){
print_ans(t, tx, ty, dir);
return true;
}
for(int i = ; i < ; ++i){
Node v = next(t, i);
if(edge[t.x][t.y][t.d][i] && judge(v.x, v.y) && dis[v.x][v.y][v.d] < ){
dis[v.x][v.y][v.d] = dis[t.x][t.y][t.d] + ;
num[v.x][v.y][v.d] = t;
q.push(v);
}
}
}
return false;
}
int main(){
while(scanf("%s", s) == ){
if(strcmp(s, "END") == ) return ;
printf("%s\n", s);
memset(edge, , sizeof edge);
int sx, sy, ex, ey;
char dir;
scanf("%d%d %c%d%d", &sx, &sy, &dir, &ex, &ey);
int d = dir_id(dir);//进起点的下一个点的朝向
int nx = sx + dr[d];//起点的下一个位置
int ny = sy + dc[d];
int x;
while(scanf("%d", &x) == ){
if(x == ) break;
int y;
scanf("%d", &y);
while(scanf("%s", s) == ){
if(s[] == '*') break;
int tmp_dir = dir_id(s[]);
int len = strlen(s);
for(int i = ; i < len; ++i){
int tmp_turn = turn_id(s[i]);
edge[x][y][tmp_dir][tmp_turn] = ;
}
}
}
bool ok = bfs(nx, ny, d, ex, ey);//起点的下一个点因为已知,所以将其当为开始的点
if(!ok){
printf(" No Solution Possible\n");
}
}
return ;
}
UVA - 816 Abbott's Revenge(bfs)的更多相关文章
- UVa 816 Abbott的复仇(BFS)
寒假的第一道题目,在放假回家颓废了两天后,今天终于开始刷题了.希望以后每天也能多刷几道题. 题意:这道BFS题还是有点复杂的,给一个最多9*9的迷宫,但是每个点都有不同的方向,每次进入该点的方向不同, ...
- UVA 816 - Abbott's Revenge(BFS)
UVA 816 - Abbott's Revenge option=com_onlinejudge&Itemid=8&page=show_problem&category=59 ...
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- UVA 816 Abbott’s Revenge
bfs求最短路,递归打印最短路的具体路径: 难点: 当前状态和转弯方式很复杂,要仔细处理: 递归打印:用一个数组存储路径中结点的前一个节点,递归查找 (bfs无法确定下一个结点,但对于没一个结点,它的 ...
- Uva 816 Abbott的复仇(三元组BFS + 路径还原)
题意: 有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出. 分析: 因为多了朝向这个元素, 所以我们bfs的队列元素就是一个三元组(r,c,dir ...
- Uva 816 Abbott's Revenge(BFS)
#include<cstdio> #include<cstring> #include<vector> #include<queue> using na ...
- uva 816 abbott's revenge ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r
- UVa 439骑士的移动(BFS)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Uva - 816 - Abbott's Revenge
这个迷宫问题还是挺好玩的,多加了一个转向的问题,有些路口不同的进入方式会有不同的转向限制,这个会比较麻烦一点,所以定义结点结构体的时候需要加一个朝向dir.总体来说是一道BFS求最短路的问题.最后打印 ...
随机推荐
- Android Dialog弹框提示
public void showUpdateDialog(String content) { //普通的AlertDialog对话框 AlertDialog.Builder builder = new ...
- 远程登陆ubantu服务器 .bashrc文件每次打开终端都需要source的问题
通过创建的用户登录ubantu服务器时,.bashrc文件每次都要重新配置,要不然里面的配置如命令的简写如 ll 等就无法识别,本方法用于实现登录时自动执行.bashrc文件. 1.ubantu启动时 ...
- 「国家集训队」Crash的数字表格
题目描述 求(对 \(20101009\) 取模,\(n,m\le10^7\) ) \[\sum_{i=1}^n\sum_{j=1}^m\operatorname{lcm}(i,j)\] 大体思路 推 ...
- Node.js 阻塞 回调函数
回调例程 N所有API都支持回调函数,可以处理大量并发请求.回调函数一般作为最后一个参数出现: function foo1(name, age, callback){ } function foo2( ...
- 认识iOS系统架构
关于本文: 文章主要介绍iOS系统架构中的四层结构的内容.常用的框架.大致的功能,然后对iOS开发人员的发展提出自己的一些拙见. 一.iOS系统是基于UNIX系统,所有从系统稳定性上来说的确比其他操作 ...
- MySQL操作之DDL
目录 SQL语句的分类 DDL语句 SQL语句的分类 DDL(Data Definition Languages)语句:数据定义语言.这些语句定义了不同的数据段. 数据库.表.列.索引等数据库对象的定 ...
- vue-cli 初始化项目时开发环境中的跨域问题
最近刚刚完成自己的毕业设计(基于Vue的信息资讯展示与管理平台),于是想整理一下过程遇到的一些问题. 项目基于Vue开发,使用 Vue-cli 初始化项目文件目录时默认占用8080端口,而我又想使用 ...
- postgresql shell脚本传递参数并执行sql脚本并
参考: https://stackoverflow.com/questions/7389416/postgresql-how-to-pass-parameters-from-command-line ...
- textarea不允许修改大小
参考:http://www.runoob.com/jsref/dom-obj-textarea.html resize:none;
- vim学习--usr03 moving around
Word movement 小写的"w""ge""e""b" w表示向后移动到一个单词开头 ge表示向前移动到一个单词末 ...