#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
typedef pair<int, int> PII; //定义pair 对象
const int N = 110;
int g[N][N], d[N][N]; //定义g 二维数组为地图,0代表可走,1代表不可走;d数组代表每一个位置距离出发的路径长度,1个格子代表长度1
int n, m; //定义n, m 分别代表行列
int beginX, beginY; //定义起始点
int endX, endY; //定义结束点
PII q[N * N], prevv[N][N]; //定义q,代表队列
vector<int> ansX, ansY; //定义容器记录路径坐标
int bfs()
{
int hh = 0, tt = 0; //队头及游标
//初始化队列
q[0] = {beginX - 1, beginY - 1};
//初始化d数组
memset(d, -1, sizeof d);
//初始化起始点为
d[beginX - 1][beginY - 1] = 0;
//定义 dx, dy ,分别代表上下左右四个方向
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
while(hh <= tt) //当队列不空时执行循环
{
auto t = q[hh ++]; //每次取队头
for (int i = 0; i < 4; i ++)
{
int x = t.first + dx[i], y = t.second + dy[i];
//判断是否当前点可走
if (x >= 0 && x < n && y >= 0 && y < m && g[x][y] == 0 && d[x][y] == -1)
{
//如果当前点可走,d数组发生变化
d[x][y] = d[t.first][t.second] + 1;
prevv[x][y] = t; //记录当前位置的上一个位置
q[++ tt] = {x, y}; //x, y点入队
}
}
}
int x = endX - 1, y = endY - 1;
while(x || y)
{
//将最短路径的x, y坐标从最后一个位置开始向前找,分别放入ansX, ansY中
ansX.push_back(x);
ansY.push_back(y);
auto t = prevv[x][y];
x = t.first, y = t.second;
}
return d[endX - 1][endY - 1];
}
int main()
{
//初始化数据
cin >> n >> m;
cin >> beginX >> beginY >> endX >> endY;
for (int i = 0; i < n; i ++)
for (int j = 0; j < m; j ++)
cin >> g[i][j];
printf("从(%d,%d) 到 (%d, %d)的最短路径长度为:%d\n",beginX, beginY, endX, endY, bfs());
cout << "最短路径为:" << endl;
//遍历路径位置信息并输出
for (int i = ansX.size() - 1; i >= 0; i --)
{
if (i)
cout << "(" << ansX[i] + 1 << "," << ansY[i] + 1 << ")" << "->";
else
cout << "(" << ansX[i] + 1 << "," << ansY[i] + 1 << ")";
}
return 0;
}
厉害,你是吃代码长大的吗?
啊这…在下菜鸡一枚