这题是最模板的BFS题了,直接用queue容器写模板就行。
广度优先走迷宫的思想:
- 将起点入队
- 将队首节点的可拓展节点入队
- 拓展完或者没有可拓展的点,就将该点(即队首节点)出队
- 重复该步骤直到到达目标或者队列为空(即找不到到达目标的方法)
注意:(虽然这题不用考虑)要做迷宫的原数组应该全部初始化为做墙壁的元素(因为该题的墙壁是0所以就不用处理)。
#include <iostream>
#include <queue>
using namespace std;
int arr[200][200];
int tap[200][200];
//定义一个点的结构体
struct point
{
int x;
int y;
int step;
};
//定义方向数组,下面搜索队首点的可拓展点时要用
//(我这里写的是右下左上的遍历顺序)
int directionx[4] = {0,1,0,-1};
int directiony[4] = {1,0,-1,0};
int main()
{
queue <point> qe;
int N, M,x1,y1,x2,y2;
cin >> N >> M;
//留出一行一列防止数组越界
for (int i = 1; i <= N; i++)
for (int j = 1; j <= M; j++)
cin >> arr[i][j];
cin >> x1 >> y1 >> x2 >> y2;
//将起点入队
point startpoint = {x1,y1,0};
tap[x1][y1] = 1;
qe.push(startpoint);
//搜索
while (!qe.empty())//结束条件:无解
{
//结束条件:有解
if (qe.front().x == x2 && qe.front().y == y2)
{
cout << qe.front().step << endl;
return 0;
}
//向四方可入队的节点搜索
for (int i = 0; i < 4; i++)
{
int tx = qe.front().x;
int ty = qe.front().y;
if (arr[tx + directionx[i]][ty + directiony[i]] == 1 && tap[tx + directionx[i]][ty + directiony[i]] == 0)
{
point temp;
temp = { tx + directionx[i] ,ty + directiony[i] ,qe.front().step + 1};
qe.push(temp);
//将遍历过的点标记,防止乱跑
tap[tx + directionx[i]][ty + directiony[i]] = 1;
}
}
//将队首节点弹出
qe.pop();
}
cout << -1 << endl;
return 0;
}