一、题目内容
二、题目分析
在二维矩阵运算中,什么时候使用BFS,什么时候使用DFS呢?当我们需要查找一个结果是否存在的时候,可以使用DFS,因为它是先执行一种情况直到输出结果,如果不符合再继续寻找其他的,这样的话,当找到一个结果的时候就可以直接返回了。但是当我们的需求是找到最长或者最短的结果,那么最优的解法还是使用BFS,因为正如我上面说的,如果要用DFS,它会将每种情况都执行到出结果,那么为了找到符合条件的最短或最长结果,需求遍历所有结果,然后输出需要的那个。而BFS的优势在于,它在一开始就是遍历所有结果,一层层往下进行,只要找到一种结果,那么就是最优结果,直接输出即可。
代码:
if(grid[0][0]==1)
return -1;
int n = grid.length;
if(n==1)
return 1;
Queue<int []>queue=new LinkedList<>();
int [][] arr ={{1,0},{0,1},{1,1},{1,-1},{0,-1},{-1,0},{-1,-1},{-1,1}};
//int [][] arr ={{1,0},{0,-1},{1,-1}};
grid[0][0]=1;
queue.add(new int []{0,0});
int path=1;
while(!queue.isEmpty()){
int size=queue.size();
for(int k=0;k<size;k++){
int []tmp=queue.poll();
int tmpi=tmp[0];
int tmpj=tmp[1];
if(tmpi==n-1&&tmpj==n-1)
return path;
for(int []cur: arr){
int curi=cur[0]+tmpi;
int curj=cur[1]+tmpj;
if(curi>=0&&curi<n&&curj>=0&&curj<n&&grid[curi][curj]==0){
grid[curi][curj]=1;
queue.add(new int []{curi,curj});
}
}
}
path++;
}
return -1;
}