UVA 816 - Abbott's Revenge(BFS)
UVA 816 - Abbott's Revenge
题意:一个迷宫,每一个点限制了从哪一方向来的。仅仅能往左右前走,然后问起点到终点的最短路径
思路: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's Revenge(BFS)的更多相关文章
- uva 816 - Abbott's Revenge(有点困难bfs迷宫称号)
是典型的bfs,但是,这个问题的目的在于读取条件的困难,而不是简单地推断,需要找到一种方法来读取条件.还需要想办法去推断每一点不能满足条件,继续往下走. #include<cstdio> ...
- uva 816 abbott's revenge ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAncAAAN5CAYAAABqtx2mAAAgAElEQVR4nOy9sY4jydKezVuoayhH0r
- UVA - 816 Abbott's Revenge(bfs)
题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...
- UVA 816 -- Abbott's Revenge(BFS求最短路)
UVA 816 -- Abbott's Revenge(BFS求最短路) 有一个 9 * 9 的交叉点的迷宫. 输入起点, 离开起点时的朝向和终点, 求最短路(多解时任意一个输出即可).进入一个交叉 ...
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 【算法导论】图的广度优先搜索遍历(BFS)
图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...
- 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现
1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...
- 【BZOJ5492】[HNOI2019]校园旅行(bfs)
[HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...
- 深度优先搜索(DFS)和广度优先搜索(BFS)
深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...
随机推荐
- TabHost Tab的添加和删除
TabHost 添加Tab项: tabhost = this.getTabHost(); TabSpec tabSpec = tabhost.newTabSpec("news"); ...
- 从表中随机返回n条记录
创建测试用表: CREATE OR REPLACE VIEW V AS SELECT 'a' AS c FROM dual UNION ALL SELECT 'b' AS c FROM dual UN ...
- Backbone.js developer 武汉 年薪8w-10w
1. 精通Backbone.js 2. 熟练Ajax.NoSQL.RESTful APIs 3. 了解Pusher.com和 Parse.com 4. 具有良好的沟通能力,学习能力,敬 ...
- bzoj 2095: [Poi2010]Bridges(二分法+混合图的欧拉回路)
[题意] 给定n点m边的无向图,对于边u,v,从u到v边权为c,从v到u的边权为d,问能够经过每条边一次且仅一次,且最大权值最小的欧拉回路. [思路] 二分答案mid,然后切断权值大于mid的边,原图 ...
- IO-同步,异步,阻塞,非阻塞,阅读摘要
http://www.cnblogs.com/Fly-Wind/p/io.html http://blog.csdn.net/historyasamirror/article/details/5778 ...
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- SCAU 07校赛 10317 Fans of Footbal Teams
10317 Fans of Footbal Teams 时间限制:1000MS 内存限制:65535K 题型: 编程题 语言: 无限制 Description Two famous footba ...
- java出现no XXX in java.library.path的解决办法及eclipse配置
java一般使用两个path:classpath 和 java.library.path classpath是指向jar包的位置 java.library.path是非java类包的位置如(dll,s ...
- Struts2 文件上传
一:表单准备 ① 要想使用HTML 表单上传一个或多个文件 –须把 HTML表单的 enctype属性设置为multipart/form-data –须把HTML 表单的method ...
- MFC 应用、模板、框架、文档、视图 的关系
从该对象 如何访问其他对象 全局函数 调用全局函数AfxGetApp可以得到CWinApp应用类指针 应用 AfxGetApp()->m_pMainWnd为框架窗口指针:用CWinApp::Ge ...