dfs和bfs是搜索算法的经典,解决迷宫图最短路径问题,dfs解决起来很麻烦,但是bfs却很在行。
例题
黄色是障碍物,不可走
思路分析
bfs用到队列,Java中使用LinkedList
,将开始的地点加入到队列,然后开始循环,以该点(也就是队列中最前面的元素)为基础,向四个方向探索,探索前做好判断,探索完所有方向之后,将改点弹出。循环的终止条件为队列为空或者已到达终点
代码实现
public class Main {
public static void main(String[] args) {
int[][] map=new int [5][4];//地图
boolean[][] view = new boolean[5][4];//保存已访问过的点
boolean flag=false;//标记是否找到
map[0][2]=1;//障碍物
map[2][2]=1;
map[3][1]=1;
map[4][3]=1;
LinkedList<Local>queue=new LinkedList<>();
queue.add(new Local(0,0,0));//从(0,0)点开始
view[0][0]=true;
while(queue.size()!=0) {
int x=queue.getFirst().x;
int y=queue.getFirst().y;
int s=queue.getFirst().step;
//如果找到了终点
if(x==2&&y==3) {
System.out.printf("最短%d步",s);
flag=true;
break;
}
//可以走的判定条件是:下一步的下标不越界&&下一步不是已访问过&&下一步不是障碍物
//向左
if(x-1>=0&&view[y][x-1]==false&&map[y][x-1]!=1) {
queue.add(new Local(y,x-1,s+1));//探索
view[y][x-1]=true;//标记为已访问
}
//向右
if(x+1<=3&&view[y][x+1]==false&&map[y][x+1]!=1) {
queue.add(new Local(y,x+1,s+1));
view[y][x+1]=true;
}
//向上
if(y-1>=0&&view[y-1][x]==false&&map[y-1][x]!=1) {
queue.add(new Local(y-1,x,s+1));
view[y-1][x]=true;
}
//向下
if(y+1<=4&&view[y+1][x]==false&&map[y+1][x]!=1) {
queue.add(new Local(y+1,x,s+1));
view[y+1][x]=true;
}
queue.removeFirst();
}
if(!flag) {
System.out.println("没找到!");
}
}
static class Local{
public int x;
public int y;
public int step;
Local(int i,int j,int s){
y=i;
x=j;
step=s;
}
}
}
当然以上代码只根据例题编写,朋友理解之后可以单独做一个bfs方法