题目
题解
- 最短路径一般考虑用广度优先遍历
- 深度优先遍历考虑所有的情况,对值进行更新,时间复杂度高
- 考虑dfs的基础原理,规范代码书写,对于矩阵上下左右,或者8邻域的遍历可采取for循环形式;此外,此题中res++与res+1的含义进行反思
代码
// class Solution {
// public:
// int min_res=1000000000;//1e9
// int xx[8]={1,-1,1,-1,1,-1,0,0};//表示8个方向
// int yy[8]={1,1,-1,-1,0,0,1,-1};
// bool vis[105][105];//判断哪些位置被访问了,避免同一个位置被多次访问
// void dfs(vector<vector<int>>& grid,int x,int y,int res){
// int n=grid.size();
// if(x==n-1&&y==n-1&&grid[x][y]==0)
// {
// min_res=min(res,min_res);
// return ;
// }
// for(int i=0;i<8;i++)
// {
// int X=x+xx[i];
// int Y=y+yy[i];
// if(X<0||X>=grid.size()||Y<0||Y>=grid[0].size())continue;
// if(vis[X][Y])continue;
// if(grid[X][Y]==1)continue;
// vis[X][Y]=true;
// //res++;对后面有影响
// dfs(grid,X,Y,res+1);
// vis[X][Y]=false;//释放
// }
// /*
// if(i-1>=0&&grid[i-1][j]==0){flag=1;res++;dfs(grid,i-1,j,res);}
// if(i+1<n&&grid[i+1][j]==0){flag=1;res++;dfs(grid,i+1,j,res);}
// if(j-1>=0&&grid[i][j-1]==0){flag=1;res++;dfs(grid,i,j-1,res);}
// if(j+1<n&&grid[i][j+1]==0){flag=1;res++;dfs(grid,i,j+1,res);}
// if(i-1>=0&&j-1>=0&&grid[i-1][j-1]==0){flag=1;res++;dfs(grid,i-1,j-1,res);}
// if(i+1<n&&j-1>=0&&grid[i+1][j-1]==0){flag=1;res++;dfs(grid,i+1,j-1,res);}
// if(i-1>=0&&j+1<n&&grid[i-1][j+1]==0){flag=1;res++;dfs(grid,i-1,j+1,res);}
// if(i+1<n&&j+1<n&&grid[i+1][j+1]==0){flag=1;res++;dfs(grid,i+1,j+1,res);}
// */
// }
// int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
// if(grid[0][0]==1) return -1;
// dfs(grid,0,0,1);
// return min_res==1e9?-1:min_res;
// }
// };
class Solution {
public:
int xx[8]={1,-1,1,-1,1,-1,0,0};//表示8个方向
int yy[8]={1,1,-1,-1,0,0,1,-1};
bool vis[105][105];
int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
if(grid[0][0]==1) return -1;
queue<pair<int,int>> que;
que.push({0,0});
int res=0;
while(!que.empty()){
int n=que.size();
res++;
for(int j=0;j<n;j++){
auto tmp=que.front();
que.pop();
int x=tmp.first;
int y=tmp.second;
if(x==grid.size()-1&&y==grid.size()-1) return res;
for(int i=0;i<8;i++)
{
int X=x+xx[i];
int Y=y+yy[i];
if(X<0||X>=grid.size()||Y<0||Y>=grid[0].size())continue;
if(vis[X][Y])continue;
if(grid[X][Y]==1)continue;
vis[X][Y]=true;
que.push({X,Y});
}
}
}
return -1;
}
};