图片和代码来自b站BV16C4y1s7EF
#include <bits/stdc++.h>
using namespace std;
int a[100][100], v[100][100];
/*输入格式
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 (起点坐标为1,1 终点坐标为 4,3)
*/
struct point {
int x;
int y;
int step;
};// 定义结构体来记录点
queue<point> r;//申请队列
int dx[4] = {0, 1, 0, -1}; //四个方向右下左上
int dy[4] = {1, 0, -1, 0};
int main() {
//输入阶段
int n, m, startx, starty, p, q;
//startx,starty为起点的横纵坐标 ,p q 为终点的横纵坐标
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
}
scanf("%d%d%d%d", &startx, &starty, &p, &q);
//BFS
point start; // 定义一个起点
start.x = startx;
start.y = starty;
start.step = 0;
r.push(start);//将起点入队
v[startx][starty] = 1; //设置为已经访问
int flag = 0; //终点的标记
while (!r.empty()) {//只要队列不为空就一直找
int x = r.front().x;
int y = r.front().y;
if (x == p && y == q) {
//如果找到终点了
flag = 1; //将标记改为1
printf("%d", r.front().step);
break;
}
for (int k = 0; k <= 3; k++) {
//四个方向试探,所以k从0到3
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) {
printf("没有找到终点");
}
return 0;
}