bfs的迷宫问题再探索

何为bfs遍历迷宫算法

bfs就是扩散问题,在每一个点,在条件允许的情况下,依次向下,右,上,左来进行扩散,因为是广度所以设计的方向广,触角也就触及的长,当某一触角率先触及到终点时,我们就认为找到了出口,然后利用回溯思想将这条走过的路记录下来。

如何完成这一过程

那么如何完成这一个过程,首先我们要利用一个flag标记数组,来记录自己是否
走过这条路,并逐次加一,便于后期回溯,其次,我们要利用队列来记录每次向,
四周扩散的应该是哪一个点,当所有点都扩散完毕时依旧没有找到出口,证明该
迷宫不存在通路(遇到通路立即跳出遍历,即已求出最短路径!)

package 经典算法;
import java.util.*;

public class bfs遍历图 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //方向数组
        int[] dx = {1,0,-1,0};
        int[] dy = {0,1,0,-1};
        
        //原始数组
        int[][] map = new int[5][5];
        //记录数组
        int[][] flag = new int[5][5];
        
        //数组赋值
        for(int i = 0;i < 5;i++) {
        	for(int j = 0;j < 5;j++) {
        		map[i][j] = sc.nextInt();
        	}
        }
        //创建第一个坐标结点
        Node first = new Node(0,0);
        //过程队列,记录结点坐标
        Queue<Node> queue = new LinkedList<>();
        //队列添加第一个要向四周扩散的结点
        queue.add(first);
        
        while(!queue.isEmpty()) {
        	//过程记录结点
        	Node temp = null;
        	//接受本次要向四周扩散的结点坐标
        	temp = queue.poll();
        	//当找到出口时,退出过程寻找
    		if(temp.x == 4 && temp.y == 4) {
    			break;
        	}
    		//将当前结点向四周依次扩散
        	for(int i = 0;i < 4;i++) {
	        	int nx = temp.x + dx[i];
	        	int ny = temp.y + dy[i];
	        	//判断能否向该方向扩散
        		if(0 <= nx && nx < 5 && 0 <= ny && ny < 5) {
        			if(map[nx][ny] != 1 && flag[nx][ny] == 0) {
        				//如果各项条件满足,则创建新结点
        				Node next = new Node(nx,ny);
        				//新结点入队列
						queue.add(next);
						//记录数组进行绘制
						flag[nx][ny] = flag[temp.x][temp.y]+1;
        			}
        		}
        	}
        }
        //打印记录数组
        for(int i = 0;i < 5;i++) {
        	for(int j = 0;j < 5;j++) {
        		System.out.print(flag[i][j] + "  ");
        	}
        	System.out.println();
        	System.out.println();
        }
        //**********************************回溯*******************************
        //创建栈结构来存储路径
        Stack<Map<Integer,Integer>> stack = new Stack();
        //回溯以终点为起点
        int add = flag[4][4];
        int i = 4;int j = 4;
        while(add >= 1) {
        	add--;
        	//依次从左边和上边两个方向判断来源,合适则以map的形式存储并入栈
        	if(i >= 0 && j-1 >= 0 && flag[i][j-1] == add) {
        		Map map1 = new HashMap<Integer, Integer>();
        		map1.put(i, j-1);
        		stack.push(map1);
        		j--;
        		continue;
        	}else if(i-1 >= 0 && j >= 0 && flag[i-1][j] == add) {
        		Map map1 = new HashMap<Integer, Integer>();
        		map1.put(i-1, j);
        		stack.push(map1);
        		i--;
        		continue;
        	}
        }
        //回溯完成之后,则输出走过的路程
        while(!stack.isEmpty()) {
        	Map map1 = stack.pop();
        	System.out.println(map1);
        }
        
    }

}
class Node{
    int x;
    int y;
    public Node(int x,int y){
        this.x = x;
        this.y = y;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值