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. c# 进行AE开发时,如何在地图上定位出一个点

    一.文本形式的气泡提示框 由于本人是初学,所以具体的含义尚未弄清楚,直接给出代码吧!

  2. MySQL数据库分布式事务XA优缺点与改进方案

    1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...

  3. window下版本控制工具Git 客户端安装

    安装使用 1.下载msysgit http://code.google.com/p/msysgit/ 2.下载tortoisegit客户端安装 http://code.google.com/p/tor ...

  4. [转载] python+Eclipse+pydev环境搭建

    转自:http://www.cnblogs.com/Bonker/p/3584707.html 编辑器:Python 自带的 IDLE 简单快捷, 学习Python或者编写小型软件的时候.非常有用. ...

  5. XNA Game Studio 4.0 Programming 随便读,随便记 “Game Class”

    XNA 中的 Game 类,是所有神奇事情发生的地方.几乎游戏中所有的事情都由它来操办. 它是项目中的王者,让我们深入窥探一番: 虚方法 Game 本身从众多其它地方继续了许多能力才能完成游戏中的事情 ...

  6. Tkinter教程之Event篇(1)'

    本文转载自:http://blog.csdn.net/jcodeer/article/details/1823544 ''Tkinter教程之Event篇(1)'''# 事件的使用方法'''1.测试鼠 ...

  7. C++ 之高效使用STL ( STL 算法分类)

    http://blog.csdn.net/zhoukuo1981/article/details/3452118

  8. C++中的重载,隐藏,覆盖,虚函数,多态浅析

    直到今日,才发现自己对重载的认识长时间以来都是错误的.幸亏现在得以纠正,真的是恐怖万分,雷人至极.一直以来,我认为重载可以发生在基类和派生类之间,例如: class A { public: void ...

  9. ubuntu java jdk安装及环境变量设置

    1.下载jdk1.7.0_79 (32位操作系统)jdk-7u79-linux-i586.tar.gz (64位操作系统)jdk-7u79-linux-x64.tar.gz http://www.or ...

  10. FLEX实现两侧边栏固定中间自适应布局

    <style type="text/css"> #outer{ display: flex; width: 100%; flex-flow: row nowrap; } ...