迷宫最短路径BFS(c++)

题目描述

设计一个算法找一条从迷宫入口到出口的最短路径。

输入

迷宫的行和列m n

迷宫的布局

输出

最短路径

样例输入

6 8
0 1 1 1 0 1 1 1
1 0 1 0 1 0 1 0
0 1 0 0 1 1 1 1
0 1 1 1 0 0 1 1
1 0 0 1 1 0 0 0
0 1 1 0 0 1 1 0

样例输出

(6,8)
(5,7)
(4,6)
(4,5)
(3,4)
(3,3)
(2,2)
(1,1)

这是一个比较经典的BFS问题。具体思路:先将入口压入队列中。然后向四周扩散(即寻找与入口相邻的元素)。根据样例可以得到,此题目要求的是八个方向。得到队首元素(得到后需要将其弹出),然后依次检测其相邻八个方向,如果是通路,则将其下标压入队列中。重复上次操作,直到找到出口

我们定义一个二维数组来存放路径。数组中的内容是当前点的前一个点。
即当前点就是由其下标所对应的元素经过某方向移动得到

做此题时,可以想象一下一滴水滴在水面上激起的波纹,能够更好的理解BFS思想

#include <iostream>
#include <queue>

using namespace std;

int x, y, ex, ey;
int sx, sy;
int** map;//地图

int dir[8][2] = {//八方向,如果遇到是四方向,删掉一些就可以了
	{-1,0},//上
	{-1,1},//右上
	{0,1},//右
	{1,1},//右下
	{1,0},//下
	{1,-1},//左下
	{0,-1},//左
	{-1,-1}//左上
};

struct Node {
	int x, y;
	Node() {}
	Node(int a, int b) { x = a; y = b; }
};

Node** path;//记录路径,存放的是前一个点是坐标(即现坐标是由哪个坐标移动得到的)

queue<Node> q;

void BFS(int tx, int ty) {
	q.push(Node(tx, ty));
	while (!q.empty()) {

		Node node = q.front();//得到队首元素
		q.pop();//弹出队首
		if (node.x == ex && node.y == ey) return;

		for (int i = 0; i < 8; i++) {//检测八个方向,如果可以走,将坐标点压入栈中
			int tpx = node.x + dir[i][0];
			int tpy = node.y + dir[i][1];
			if (tpx < 0 || tpx >= x || tpy < 0 || tpy >= y || map[tpx][tpy] == 1)
				continue;
			path[tpx][tpy] = node;
			q.push(Node(tpx, tpy));
			map[tpx][tpy] = 1;
		}
	}
}

void outPath() {//正常应该是输出下标,题目要求,所以输出的是 下标+1
	int t1 = ex, t2 = ey;

	cout << "(" << ex + 1 << "," << ey + 1 << ")" << endl;//出口

	while (path[t1][t2].x != sx || path[t1][t2].y != sy) {
		cout << "(" << path[t1][t2].x + 1 << "," << path[t1][t2].y + 1 << ")" << endl;
		int p = t1;
		t1 = path[t1][t2].x;
		t2 = path[p][t2].y;
	}

	cout << "(" << sx + 1 << "," << sy + 1 << ")" << endl;//入口(下标+1,下标+1)
}


int main() {
	sx = sy = 0;
	cin >> x >> y;
	ex = x - 1;
	ey = y - 1;
//迷宫的实现与初始化
	map = new int* [x];
	for (int i = 0; i < x; i++)
		map[i] = new int[y];

	for (int i = 0; i < x; i++) {
		for (int j = 0; j < y; j++) {
			cin >> map[i][j];
		}
	}
//用于存放路径的二维数组
	path = new Node * [x];
	for (int i = 0; i < x; i++)
		path[i] = new Node[y];
//全部初始化(0,0)
	for (int i = 0; i < x; i++) {
		for (int j = 0; j < y; j++) {
			path[i][j] = Node(0, 0);
		}
	}

	BFS(sx, sy);

	outPath();

}

欢迎交流

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值