ACM:图BFS,迷宫

称号:

网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示)。你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长、下一个、左、向右移动到下一个单元格。

不论什么时候都不能在障碍格中。也不能走到迷宫之外。

起点和终点保证是空地。

分析:图的BFS。

#include <iostream>
#include <string>
#include <queue>
using namespace std;

const int MAXN = 500;
int maze[MAXN][MAXN], vis[MAXN][MAXN], dist[MAXN][MAXN], fa[MAXN][MAXN], last_dir[MAXN][MAXN];
int n, m, xs, ys, xt, yt;

int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
char name[] = "UDLR";

void print_path(int x, int y) {      //以递归的方式打印路径
	int fx = fa[x][y] / m;
    int fy = fa[x][y] % m;
    if(fx != x || fy != y) {
		print_path(fx, fy);
		putchar(name[last_dir[x][y]]);
    }
}

int dir[MAXN*MAXN];
void print_path2(int x, int y) {      //以迭代的方式打印路径
	int c = 0;
	for(;;) {
		int fx = fa[x][y] / m;
		int fy = fa[x][y] % m;
		if(fx == x && fy == y) break;
		dir[c++] = last_dir[x][y];
		x = fx;
 		y = fy;
	}
	while(c--) putchar(name[dir[c]]);
}

queue<int> q;
void bfs(int x, int y) {
	int u = x*m+y;
	dist[x][y] = 0;   //初始化自己到自己的距离就是0
	fa[x][y] = u;     //起点的父亲节点就是自己。方便后面的打印操作
	vis[x][y] = 1;
	q.push(u);
	while(!q.empty()) {
		u = q.front();
		q.pop();
		x = u/m;
		y = u%m;
		for(int d = 0; d < 4; ++d) {
			int nx = x + dx[d];
			int ny = y + dy[d];
			if(nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] && !vis[nx][ny]) {
				int v = nx * m + ny;
				q.push(v);
				vis[nx][ny] = 1;
				dist[nx][ny] = dist[x][y] + 1;    //走的步数+1
				fa[nx][ny] = v;                   //记录父亲结点
				last_dir[nx][ny] = d;             //记录如今这个节点到父亲节点走的方向
			}
		}
	}
}

int main() {
	cin >> n >> m >> xs >> ys >> xt >> yt;
	for(int i = 0; i < n; ++i) {
		for(int j = 0; j < m; ++j) {
			cin >> maze[i][j];
		}
	}
	memset(vis, 0, sizeof(vis));
	bfs(xs, ys);
	print_path(xt, yt);
	cout << endl;
	print_path2(xt, yt);
	cout << endl;
	return 0;
}
时间: 2024-10-17 11:05:04

ACM:图BFS,迷宫的相关文章

uva 816 BFS迷宫

这是一道比较复杂的BFS迷宫问题,状态由普通的迷宫问题的坐标(x,y)变为三个变量的状态(r,c,dir)其中dir是到达(r,c)两点的方向,这个变量非常重要,导致了这题比普通的BFS迷宫问题要更加复杂. 普通BFS解法 http://blog.csdn.net/iboxty/article/details/45888923 BFS是用队列实现的,很重要并且要理解的是:每一个节点只访问一次,而且每次BFS过程都保证压入队列中的节点到起点的距离是最短的,这题也有这样的思想. #include <

uva 816 - Abbott&#39;s Revenge(有一点难度的bfs迷宫题目)

就是典型的bfs,但这道题目的难点在于其条件的读取和判断并不简单,需要想办法来读取条件,也需要想办法来判断在每个点处能不能满足向下继续走的条件. #include<cstdio> #include<cstring> #include<string> #include<queue> #include<iostream> #include<algorithm> using namespace std; struct note { int

生化危机 邻接表存图+BFS

生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室. 恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天

(图 BFS)走迷宫

题目: 给一个迷宫,求出从起点到终点的路径.迷宫 src.txt 文件内容如下,第一行是迷宫的行列数,后面行是迷宫,1表示可行走,0表示不可以通过,起点是最左上角,终点是最右下角: 1 6 5 2 1 1 0 1 1 3 1 0 1 1 1 4 1 0 1 0 0 5 1 0 1 1 1 6 1 1 1 0 1 7 1 1 1 1 1 解析: 其实就是图的广度优先遍历. 代码及运行结果: 1 #include <iostream> 2 #include <queue> 3 #inc

POJ2251Dungeon Master(三维图)(BFS)

Dungeon Master Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17444   Accepted: 6790 Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled

PTA 5-7(中文) 六度空间 (30) - 图 - BFS

“六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够认识任何一个陌生人.”如图6.4所示. 图6.4 六度空间示意图 假如给你一个社交网络图,请你对每个节点计算符合“六度空间”理论的结点占结点总数的百分比. 输入格式说明: 输入第1行给出两个正整数,分别表示社交网络图的结点数N (1<N<=104,表示人数).边数M(<=33*N,表示社交关

杭电 HDU ACM 1728 逃离迷宫

逃离迷宫 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18241    Accepted Submission(s): 4409 Problem Description 给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地

算法系列之图--BFS

广度优先搜索以源结点s为出发点,算法始终将已发现和未发现结点之间的边界,沿其广度方向向外扩展.也即算法需要在发现所有距离源结点s为k的所有结点之后才会去发现距离源结点距离为k+1的其他结点. talk is cheap,show me the code!上具体的代码,最容易解释这一切. 该例子是以无向图为基础,代码中注释有具体说明,不在解释每一步: 1 #include <iostream> 2 #include <list> 3 #include <queue> 4

【BZOJ3417】Poi2013 Tales of seafaring 分层图BFS

[BZOJ3417]Poi2013 Tales of seafaring Description 一个n点m边无向图,边权均为1,有k个询问 每次询问给出(s,t,d),要求回答是否存在一条从s到t的路径,长度为d 路径不必是简单路(可以自交) 2<=N<=5000,1<=M<=5000,1<=K<=1000000,1<=d<=1000000000 Sample Input 8 7 4 1 2 2 3 3 4 5 6 6 7 7 8 8 5 2 3 1 1