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。每一个点拆成4个方向的点。相应能走的方向建图跑一下bfs就可以

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std; const int N = 10005;
const int D[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1};
char name[25]; int n, m;
vector<int> g[15][15][4]; struct State {
int x, y, dir;
int pre;
} Q[N], s, e; char str[25];
int x, y, vis[15][15][4]; int hash(char c) {
if (c == 'F') return 0;
if (c == 'R') return 1;
if (c == 'L') return -1;
if (c == 'N') return 0;
if (c == 'E') return 1;
if (c == 'S') return 2;
return 3;
} #define MP(a,b) make_pair(a,b)
typedef pair<int, int> pii;
vector<pii> ans; void print(int u) {
if (u == -1) return;
print(Q[u].pre);
ans.push_back(MP(Q[u].x, Q[u].y));
} void bfs() {
ans.clear();
memset(vis, 0, sizeof(vis));
int head = 0, rear = 0; s.pre = -1;
Q[rear++] = s;
vis[s.x][s.y][s.dir] = 1;
while (head < rear) {
State u = Q[head++];
if (u.x == e.x && u.y == e.y) {
print(head - 1);
int tot = ans.size();
for (int i = 0; i < tot; i++) {
if (i % 10 == 0) printf("\n ");
printf(" (%d,%d)", ans[i].first, ans[i].second);
}
printf("\n");
return;
}
for (int i = 0; i < g[u.x][u.y][u.dir].size(); i ++) {
int di = (g[u.x][u.y][u.dir][i] + u.dir + 4) % 4;
State v = u;
v.x += D[di][0]; v.y += D[di][1];
if (v.x < 0 || v.y < 0) continue;
v.dir = di;
if (vis[v.x][v.y][v.dir]) continue;
vis[v.x][v.y][v.dir] = 1;
v.pre = head - 1;
Q[rear++] = v;
}
}
printf("\n No Solution Possible\n");
} int main() {
while (~scanf("%s", name) && strcmp(name, "END")) {
memset(g, 0, sizeof(g));
printf("%s", name);
scanf("%d%d%s", &s.x, &s.y, str);
s.dir = hash(str[0]);
scanf("%d%d", &e.x, &e.y);
g[s.x][s.y][hash(str[0])].push_back(0);
int x, y;
while (scanf("%d", &x) && x) {
scanf("%d", &y);
while (scanf("%s", str) && str[0] != '*') {
int len = strlen(str);
for (int i = 1; i < len; i++)
g[x][y][hash(str[0])].push_back(hash(str[i]));
}
}
bfs();
}
return 0;
}

UVA 816 - Abbott&#39;s Revenge(BFS)的更多相关文章

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

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

  2. uva 816 abbott&#39;s revenge ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r

  3. UVA - 816 Abbott's Revenge(bfs)

    题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...

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

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

  5. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  6. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  7. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  8. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  9. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

随机推荐

  1. CXF之五 拦截器Interceptor

    拦截器(Interceptor)是CXF功能最主要的扩展点,可以在不对核心模块进行修改的情况下,动态添加很多功能.拦截器和JAX-WS Handler.Filter的功能类似,当服务被调用时,就会创建 ...

  2. WIND2003 安装Zend studio 报错

    在安装zend stutio是系统报错,貌似是签章检验没有通过,去查了一下网上的解决方式多种多样,经过验证后发现以下可以解决我的问题特做记录 机器配置是E2160+4G 异常信息是:File c:\W ...

  3. 翻译【ElasticSearch Server】第一章:开始使用ElasticSearch集群(1)

    我们要做的第一件事是安装ElasticSearch.对于多数应用程序,您开始安装和配置,通常忘记这些步骤的重要性,直到发生了糟糕的事情.这章我们将广泛关注ElasticSearch的这部分.请注意本章 ...

  4. java ant 命令大全

    ANT命令总结 1 Ant是什么? Apache Ant 是一个基于 Java的生成工具.生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式).随 ...

  5. 下破解安装Python开发工具WingIDE4.1

    步骤: 1.将系统时间调整到一个月之前,然后执行安装. 可以使用date命令调整系统时间,如:date -s '2012-08-14 10:00:00' 2.安装成功后,打开程序,按照提示信息,申请一 ...

  6. 《锋利的Jquery第二版》读书笔记 第一章

    按照书本介绍顺序整理jquery库相关的语法.要点. window.onload与$(document).ready()功能类似,前者需要所有资源加载完毕,且不能同时编写多个:后者加载完DOM结构即执 ...

  7. 基于Hbase数据的Mapreduce程序环境开发

    一.实验目标 编写Mapreduce程序,以Hbase表数据为Map输入源,计算结果输出到HDFS或者Hbase表中. 在非CDH5的Hadoop集群环境中,将编写好的Mapreduce程序整个工程打 ...

  8. VS2015创建的C++程序在Debug模式下不能调试

    如题,不能调试的问题,解决办法: 1.修改工程属性页 2.修改VS2015托管兼容模式 工具->选项->调试,勾选使用托管兼容

  9. CoffeeScript学习(1)——Quick Start

    什么是CoffeeScript CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. Coffee ...

  10. 关于scrollTop的那些事

    大家在实际项目中,应该是要经常用到scrollTop的,它表示的是可视窗口距离页面顶部的距离,这个scrollTop是可读写的,所以可以用来做页面滚动. 但是大家或多或少遇到一些浏览器兼容问题,为什么 ...