题意:
有一张由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;
}