BFS是一层一层进行搜索的,把一层全部走完,再搜索下一层,所以BFS在边权重相同的时候,可以用来找出最短路。
思路
类似于走迷宫,从起点走到终点,碰到障碍不能走,寻找最短路
1.需要两个数组,一个存储值,一个存储距离
2.将起点进行标注
3.用队列的思想,保存头节点
4.x轴方向变量数组和y轴方向数组用于前进试探
5.如果该点在地图边界中,不是障碍物并且是第一次走,就可以前进,同时更新d[x][y]是上一个点的距离+1,并且加入队列
6.最后返回终点的距离d
队列思想:
记录当前点,往队列中放入向四个方向可走的点,把当前点弹出。
模板
queue 初始队列
while(queue不空){
取队头
扩展队头
}
题目
详解(Java)
import java.util.Scanner;
public class Main {
static int N = 110;
static int m,n;
static int[][] g = new int[N][N];//存地图
static int[][] d = new int[N][N];//存每个点走过的距离
static PII[] q = new PII[N*N];//q数组模拟队列
static int hh = 0,tt = -1;//创建队头和队尾"指针"
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();//行
m = sc.nextInt();//列
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
g[i][j] = sc.nextInt();
d[i][j] = -1;//因为起点的d[0][0]=0,初始化都为-1,还可以判断该点有没有走过
}
}
System.out.println(bfs());
}
public static int bfs(){//数组实现队列
//初始(0,0)是起点,距离为0
d[0][0] = 0;
q[++tt] = new PII(0,0);//把起点(0,0)放入队列
//坐标轴表示,顺时针方向(上(-1,0)右(0,1)下(1,0)左(0,-1))
int[] dx = new int[]{-1,0,1,0};
int[] dy = new int[]{0,1,0,-1};
while (hh <= tt){//当队列不为空时
PII t = q[hh++];//取出头节点并临时保存,为了下一个点进行是否可走的判断
for (int i = 0; i < 4; i++) {//对向上、右、下、左四个方向进行尝试
//x,y轴的上、右、下、左走之后点的判断
int x = t.first+dx[i];//进行x轴向量判断
int y = t.second+dy[i];//进行y轴向量判断
//当该点在地图边界里面,该点的地图上为0(表示为路不为阻碍物),该点没有被走过时,该点才可走,扩展进队列里面
if((x>=0 && x<n) && (y>=0 && y<m) && g[x][y] == 0 && d[x][y] == -1){
d[x][y] = d[t.first][t.second]+1;//该点走过的距离为上一个点的距离+1
q[++tt] = new PII(x,y);//把该点扩展进队列
}
}
}
return d[n-1][m-1];//返回终点走过的距离
}
}
class PII{//每个点的坐标(first,second)
int first;//横坐标
int second;//纵坐标
public PII(int first,int second) {
this.first = first;
this.second = second;
}
}
BFS是有基本模板的,以队列的思想进行理解,注意判断点的边界问题。