迷宫有n行m列的单元格组成(n,m都小于等于50)每个但余个要么是空地要么是障碍物。先请你找到一条从起点到终点的最短路径长度。
输入的地图1表示空地,2表示为障碍物。
第一行为n,m的矩阵,下面是地图矩阵
最后一行是起点和终点位置。
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
#include<iostream>
#include<queue>
using namespace std;
int a[100][100], v[100][100];
int startx, starty;
int p, q;
int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
struct point {
int x;
int y;
int step;
};
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
cin >> startx >> starty >> p >> q;
queue<point> r ;
point start;
start.x = startx;
start.y = starty;
start.step = 0;
r.push(start);//将起点入队
v[startx][starty] = 1;
int flag = 0;
//广度优先bfs
while (!r.empty()) {
int x = r.front().x, y = r.front().y;
if (x == p && y == q) {
flag = 1;//说有迷宫有路径可以出去,即有解
cout << r.front().step << endl;
break;//第一个找到的肯定是最短的路径,虽然有可能有其他路径和的长度相等
}
for (int k = 0; k <= 3; k++) {
int tx, ty;
tx = x + dx[k];
ty = y + dy[k];
if (a[tx][ty] == 1 && v[tx][ty] == 0) {//拓展点是能走的地,并且没有走过
//入队
point temp;//申请临时结构体
temp.x = tx;
temp.y = ty;
temp.step = r.front().step + 1;
r.push(temp);
v[tx][ty] = 1;//设置为已访问
}
}
r.pop();//这个节点拓展完,将这个节点出队,他此时是处于队首的
}
if (flag == 0) {
cout << "NO answer" << endl;
}
return 0;
}