Pairs数据类型需要额外导入jar包才可使用,本题自己创建
/*
1.宽度(广度)优先搜索:BFS(Breadth宽度——First——Search)
不考虑结果的可能位置,彻底地搜索整张图,即先找所有距离为1,再找所有距离为2,需额外的距离数组判断是否遍历过和记录距离、即宽度;
展开节点而得到的子节点都会被加进一个先进先出的队列,直到找到结果为止
2.最短路是包含dp问题的。最短路问题的时间复杂度高,而dp的低,所以dp问题一般不用最短路来求。
3.深搜一般没有框架,宽搜有。深度搜索可以保证搜到,但不能保证最短。
4.宽搜伪代码: 初始状态放入queue,
while queue不空
拿出队头
扩展队头
从距离数组直接拿到数据
5.(好像不太行)dp思路:f[i][j]表示 走到i,j的路径集合
集合划分:表示从上下左右四个方向而来的路径f[i-1][j],f[i][j-1],f[i+1][j],f[i][j+1]
*/
import java.util.*;
class Main{
private static int n,m;
private static int[][] p,d;
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();m=sc.nextInt();
p=new int[n][m];
d=new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
p[i][j]=sc.nextInt();
//距离值的初始值设为-1用于判断是否遍历过
d[i][j]=-1;
}
}
System.out.println(bfs());
}
//
public static int bfs(){
//队列初始化
Queue<Pair> q=new LinkedList<>();
//把(0,0)插入队头
q.add(new Pair(0,0));
int[] dx={-1,0,1,0},dy={0,1,0,-1};
while(!q.isEmpty()){
//取并弹出队头元素
Pair t=q.poll();
for(int i=0;i<4;i++){
int x=t.getKey()+dx[i],y=t.getValue()+dy[i];
//坐标不越界 && 没被遍历过 && 值为0
if(x>=0 && x<n && y>=0 && y<m && p[x][y]==0 && d[x][y]==-1){
//赋为前一个点的值+1
d[x][y]=d[t.getKey()][t.getValue()]+1;
q.add(new Pair(x,y));
}
}
}
//距离起始为-1,最终要+1
return d[n-1][m-1]+1;
}
}
class Pair{
int key;
int value;
Pair(int k,int v){key=k;value=v;}
public int getKey(){return key;}
public int getValue(){return value;}
}
现在的测试样例通不过了,卡在输入这块儿,我用BufferedReader还是不行,挺离谱的
可以的,看这篇
https://www.acwing.com/activity/content/code/content/7448093/