一、BFS(广度优先排序)
Time:O(n²)84ms
同DFS时间复杂度一样:
存储方式:1、二维数组表。time:O(n²)
2、邻接表。time:O(n+e)
豪华解析版
class Solution {
public:
// 列出八个方向上移动的方法 direction
vector<vector<int>> method={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
// 最小路径二进制矩阵
int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
//判断首位置是否为1,若是则退出
if(grid[0][0]==1)return -1;
// 记录该矩阵的行数
int n=grid.size();
// 记录步数,至少有第一步
int step=1;
// 创建队列存储要进行走路的位置
queue<pair<int,int>>q;
// 让队列指向初始位置
q.push(make_pair(0,0));
// 将走过的位置标记为2
grid[0][0]=2;
// 月读,直到队列为空,即没有下一个位置能走
while(!q.empty()){
// 记录队列中的备选位置个数
int num=q.size();
// 在备选位置中寻找下一个能走的位置
for(int i=0;i<num;i++){
// 记录当前x位置
int x=q.front().first;
// 记录当前y位置
int y=q.front().second;
// 提取完该位置后,已经没有利用价值了,就从队列中删除,让之后的位置行进
q.pop();
// 若提取的元素表格的左下角,返回步数
if(x==n-1 && y==n-1)return step;
// 枚举八个方位,看看哪些方法能走得通
for(int j=0;j<8;j++){
// x的下一个位置
int xn=x+method[j][0];
// y的下一个位置
int yn=y+method[j][1];
// 判断该位置是否走得通
// xn、yn小于0,大等于边界,且该位置存在(不为空)
if(xn<0 || yn<0 || xn>=n || yn>=n || grid[xn][yn])continue;
// 将该位置标为已走
grid[xn][yn]=2;
// 并将此位置作为备选
q.push(make_pair(xn,yn));
}
}
// 当给层的位置全都进行后,代表着走了一步(宽度优先搜索BFS:breadth first search)
step++;
}
// 无路可走
return -1;
}
};