bfs寻找最短路径并且打印路径和方向

声明!!!!!
在此之前,我写过一篇使用bfs打印路径的文章,当时使用的是map,肯定是错了,因为
bfs进行扩展的时候每一步肯定有多个节点啦,是不能确定那个节点是最终路径上的。
告诉大家我写错了,真是深深的歉意啊
,I am terribly sorry啊啊啊啊 ,为此我又重新写了一篇正解送给大家,请大家包容
一下我这个小菜鸟吧,万分感谢啦。下面上代码(注意我使用的迷宫矩阵是0和1数据)
import java.util.*;  
public class Main {  
    static Scanner in = new Scanner(System.in);  
    static int m,n,sp,ep;  
    static int[][] vis = new int[105][105];  
    static int[][] ma = new int[105][105];  
    static int[][] dir = {  
            {0,1},{1,0},{0,-1},{-1,0}  
      };   
    static char[] d = {'R','D','L','U'};//方向,后续我会扩展  
    static Queue<Node> q = new LinkedList<Node>(); 
     static void bfs(Queue<Node> q ){  
         int tx=0,ty=0;  
         boolean f=false;  
         while(!f&&!q.isEmpty()){  
               Node te = q.poll();  
           for (int i = 0; i < 4; i++) {  
              tx=te.x+dir[i][0];  
              ty=te.y+dir[i][1];  
            if(tx<0||ty<0||tx>=m||ty>=n||ma[tx][ty]==1)  
                    continue;  
            if(vis[tx][ty]==0&&ma[tx][ty]==0) {  
                vis[tx][ty]=1;    
             Node nw = new Node(tx,ty,te.step+1,te,d[i]);  
             //System.out.println(nw.x+" "+nw.y+" "+nw.step);打印调试使用
                 q.add(nw);   
            }  
            //到达终点  
            if(tx==sp&&ty==ep){  
                f=true;  
                break;                
            }  
          }  
        }  
      } 
     //递归打印路径
     static void print(Node end){
    	 if(end.parent==null){
    	  System.out.println(end.x+" "+end.y+" "+end.dir);
    		 return;
    	  }   	 
        print(end.parent);
       System.out.println(end.x+" "+end.y+" "+end.dir);
     }
    public static void main(String[] args) {           
         while(in.hasNext()) {  
            q.clear();      
            m = in.nextInt();  
            n = in.nextInt();  
            sp= in.nextInt();  
            ep=in.nextInt();  
            if(m==0&&n==0)  
                break;  
            String s;  
            for (int i = 0; i < m; i++) {  
                s=in.next();  
                for (int j = 0; j < s.length(); j++) {  
                    ma[i][j]=s.charAt(j)-48;  
                    vis[i][j]=0;  
                }  
            }  
            vis[0][0]=1;  
            Node st = new Node(0, 0, 0,null,'s');//s代表起始点  
            q.add(st);  
            bfs(q);  
            while(q.size()!=1){  
                q.poll();  
            }  
            System.out.println(q.peek().step);  
            Node end = q.poll();
            print(end);
            //也可以使用下面这个简单方法打印,只不过路径是反的
//            while(end.parent!=null){
//                System.out.println(end.x+" "+end.y);
//                end=end.parent;
//            }
//            System.out.println(end.x+" "+end.y);
        }  
    }  
}  
class Node{  
    int x;  
    int y;  
    int step;  
    Node parent;//保存父节点信息值,以打印路径
    char dir;//每次行进的方向
    Node (){}  
    Node(int x,int y,int step,Node p,char d){  
        this.x=x;  
        this.y=y;  
        this.step=step;  
        this.parent=p;
        this.dir = d;
   } 
 }
分析:思路就是使用递归定义来保存父节点的信息,即从哪一个节点扩展的就是他的父节点,这样最后的路径局可以确定啦


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值