迷宫求解-最短路径打印

 

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;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值