广度优先遍历(BFS)
和深搜不同,它是一层一层地搜索。
从图的某一结点出发,首先一次访问该节点的所有邻接点,再按这些顶点被访问的先后次序依次访问与他们相邻接且未被访问的所有的点,重复此过程,直至所有顶点均被访问为止。
用数组
#include <bits/stdc++.h>
using namespace std;
int arr[501][501];
int book[501][501];
int dx[4] ={ 0,1,0,-1 };//规定四个方向
int dy[4]= { 1,0,-1,0 };
struct f {
int x;
int y;
int s;
}map[2500];
int n;
void bfs()
{
int tail = 1, head = 1;//将起点入队
map[tail].x = 0, map[tail].y = 0;
map[tail].s = 0;
book[0][0] = 1;//标记起点
tail++;
while (head < tail)
{
int k = 0;
for (int i = 0; i < 4; i++)//遍历四个方向
{
int nx = map[head].x + dx[i];//计算下一个方向
int ny = map[head].y + dy[i];
if (nx<0 || nx>n - 1 || ny<0 || ny>n - 1)
continue;
if (book[nx][ny] == 0 && arr[nx][ny] == 0)
{
book[nx][ny] = 1;
map[tail].x = nx;//更新队列
map[tail].y = ny;
map[tail].s = map[head].s + 1;//等于父亲步数加一
tail++;
}
if (nx == n-1 && ny == n-1)//如果等于终点
{
k = 1;
cout << map[tail - 1].s;//注意要减一
break;
}
} if (k == 1)
break;
head++;//四个方向探索完毕后,head++模拟出队效果
}
}
int main(void)
{
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
scanf("%d", &arr[i][j]);
}
bfs();
return 0;
}