bfs想必非常的熟悉了,bfs大多数用来解决什么问题呢?一个最直观经典的例子就是走迷宫,我们从起点开始,找出到终点的最短路程,很多最短路径算法就是基于广度优先的思想成立的。所以这篇博客,主要是利用bfs找迷宫的最短距离。首先看看bfs一般的使用套路。
import java.util.*;
public class MigongqiujieBFS {
public static int m[][]=new int[][]{{1,0},{0,1},{0,-1},{-1,0}};
public static void main(String args[]){
Scanner in=new Scanner(System.in);
int n=Integer.parseInt(in.nextLine());
int num[][]=new int[n][n];
int visit[][]=new int[n][n];
P pre[][]=new P[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
num[i][j]=in.nextInt();
visit[i][j]=0;
pre[i][j]=new P(-1,-1);
}
}
int x0=in.nextInt();
int y0=in.nextInt();
int x1=in.nextInt();
int y1=in.nextInt();
visit[x0][y0]=1;
bfs(num,visit,x0,y0,x1,y1,pre);
if(pre[x1][y1].x==-1 && pre[x1][y1].y==-1){
System.out.println(-1);
}else {
Stack stack=new Stack<>();
stack.push(new P(x1,y1));
int tx=pre[x1][y1].x;
int ty=pre[x1][y1].y;
while(!(tx==-1 && ty==-1)){
stack.push(new P(tx,ty));
int ttx=pre[tx][ty].x;
int tty=pre[tx][ty].y;
tx=ttx;
ty=tty;
}
System.out.println(stack.size()-1);
int len=stack.size();
for(int i=0;i<len-1;i++){
P temp=(P)stack.pop();
System.out.print("("+temp.x+","+temp.y+")"+"->");
}
P temp=(P)stack.pop();
System.out.println("("+temp.x+","+temp.y+")");
}
}
public static void bfs(int num[][],int visit[][],int x0,int y0,int x1,int y1,P pre[][]){
Queue q=new LinkedList();
q.offer(x0);
q.offer(y0);
while(!q.isEmpty()){
int tx0=(int)q.poll();
int ty0=(int)q.poll();
if(tx0==x1 && ty0==y1){
return ;
}
for(int i=0;i<4;i++){
int tx=tx0+m[i][0];
int ty=ty0+m[i][1];
if(tx>=0 && tx<num.length && ty>=0 && ty<num.length && visit[tx][ty]==0 && num[tx][ty]==0){
visit[tx][ty]=1;
q.offer(tx);
q.offer(ty);
pre[tx][ty]=new P(tx0,ty0);
}
}
}
return ;
}
}
class P{
int x;
int y;
P(int x1,int y1){
x=x1;
y=y1;
}
}