【A - Maze】迷宫问题

题意:

有一张由0、1数字组成的5 × 5的二维数组表示的地图,寻找出口到入口的最短路径。地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是出口。

样例输入:
在这里插入图片描述
样例输出:
在这里插入图片描述

思路:

把地图抽象成一个平面直角坐标系,每一个0或1代表一个点,寻找两个点之间的最短路径可用bfs方法,并且走到一个点要记录其前序的点。最后从终点根据其前序点回溯至起点,然后从起点输出至终点。

总结:

bfs是解决两点之间最短路径的好方法,但是需要开一个二维数组来记录前序点,如果二维数组比较大的话其实很浪费。

判断一个点是否已经走过也可以用map,把这个点和他的前序点插入map,最后输出路径的时候在map中find(),然后输出。

代码:

#include<iostream>
#include <queue>
using namespace std;
struct point
{
	int x;
	int y;
	point(){}
	point(int ix, int iy)
	{
		x = ix;
		y = iy;
	}
};
int main()
{
	int dx[] = { 0,0,1,-1 };
	int dy[] = { 1,-1,0,0 };
	bool reach[5][5];
	int matrix[5][5];
	for (int i = 0; i < 5; i++)//读入二维数组
		for (int j = 0; j < 5; j++)
			cin >> matrix[i][j];
	point before[5][5];
	for (int i = 0; i < 5; i++)//前序点置空
		for (int j = 0; j < 5; j++)
		{
			before[i][j].x = -1;
			before[i][j].y = -1;
		}
	queue<point> way;//bfs方法
	way.push(point(0, 0));
	while (!way.empty())
	{
		point now = way.front();
		way.pop();
		if (now.x == 4 && now.y == 4)//特判终点
			break;
		for (int i = 0; i < 4; i++)
		{
			int x = now.x + dx[i];
			int y = now.y + dy[i];
			if (x >= 0 && x <= 4 && y >= 0 && y <= 4 
				&& matrix[x][y] == 0 && before[x][y].x == -1)
			{
				before[x][y].x = now.x;//记录前序点
				before[x][y].y = now.y;
				way.push(point(x, y));
			}
		}
	}
	point path[25];
	int m = 0;
	point target(4, 4);
	while (target.x != 0 || target.y != 0)//从终点回溯到起点
	{
		path[m].x = target.x;
		path[m].y = target.y;
		m++;
		target = before[target.x][target.y];
	}
	path[m].x = 0;//把起点加入路径
	path[m].y = 0;
	for (int i = m; i >= 0; i--)//从起点开始输出路径
		cout << "(" << path[i].x << ", " << path[i].y << ")" << endl;
}
发布了5 篇原创文章 · 获赞 4 · 访问量 99

猜你喜欢

转载自blog.csdn.net/qq_44047415/article/details/104625047