题目描述
设计一个算法找一条从迷宫入口到出口的最短路径。
输入
迷宫的行和列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();
}
欢迎交流