题解 | #迷宫问题##深度遍历#

迷宫问题

http://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

只要数据结构处理好,DFS深度遍历简单的很。

思路

这里就是一个简单的深度遍历运用。但是如何和深度遍历是个问题。 都知道,深度遍历只要触发到一个条件,便返回,可这个条件直接判断则比较麻烦。 所以,如果能把数据结构弄好,那么遍历就变得很简单。

将每个点进行图表示,每一个结点对应一个对象,同时把能访问到的下一个结点进行构造给当前对象,遍历的时候便深度遍历下一个结点,如果遍历到当前结点,其对应横纵坐标是目标点,则完成,保存数据,输出结果,

这里保存数据通过依次遍历父节点,直到父节点为空,便得到了路径,最后输出即可。

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m=Integer.parseInt(in.next());
        int n=Integer.parseInt(in.next());
        int [][]a=new int[m][n];//一份用来保存原始数据
        int [][]b=new int[m][n];//一份用来生成图
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                a[i][j]=Integer.parseInt(in.next());//得到初始数据。
            }
        }        
        b=a.clone();
        
        Node node=new Node();
        node.Node(b,0,0);//将初始数据进行图结构化。
        
        ArrayList<int []> list=new ArrayList<>();//保存结果
        DFS(a,node,list);//深度遍历开始
        for(int j=list.size()-1;j>=0;j--){
            System.out.println("("+list.get(j)[0]+","+list.get(j)[1]+")");
        }
    }
    
    public static void DFS(int[][] a,Node node,ArrayList<int []> list){
        if(node.i==a.length-1 && node.j==a[0].length-1){
            Node node1=node;
            //开始保存结果
            list.add(new int[]{node1.i,node1.j});
            while (node1.parent!=null){
                node1=node1.parent;
                list.add(new int[]{node1.i,node1.j});
            }
            return;
        }else {
          if(node.nextup!=null){
              DFS(a,node.nextup,list);
          }
          if(node.nextdo!=null){
              DFS(a,node.nextdo,list);
          }if(node.nextle!=null){
              DFS(a,node.nextle,list);

          }if(node.nextri!=null){
              DFS(a,node.nextri,list);
          }
        }
    }
    //is方法用来判断当前坐标是否合法,如果能通则返回true,否则返回false
    public static boolean is(int s[][],int i,int j){
        if(i<0 || i>=s.length || j<0 ||j>=s[0].length){
            return false;
        }
        if(s[i][j]==1){
            return false;
        }
        return true;
    }

    static class Node{
        int i;
        int j;
        Node nextup;//指向向上的结点
        Node nextdo;//指向向下的结点
        Node nextle;//指向向左的结点
        Node nextri;//指向向右的节点
        Node parent;//指向父节点
        
        void Node(int[][] s,int i,int j){
        //构造方法,依次生成每个结点及上下左右和父亲结点。
            this.i=i;
            this.j=j;
            s[i][j]=1;
            if(is(s,i-1,j)){
                Node nodeup=new Node();
                nodeup.Node(s,i-1,j);
                nodeup.parent=this;
                this.nextup=nodeup;
            }else{
                this.nextup=null;
            }
            if(is(s,i+1,j)){
                Node nodedo=new Node();
                nodedo.Node(s,i+1,j);
                nodedo.parent=this;
                this.nextdo=nodedo;
            }else{
                this.nextdo=null;
            }
            if(is(s,i,j-1)){
                Node nodele=new Node();
                nodele.Node(s,i,j-1);
                nodele.parent=this;
                this.nextle=nodele;
            }else{
                this.nextle=null;
            }
            if(is(s,i,j+1)){
                Node noderi=new Node();
                noderi.Node(s,i,j+1);
                noderi.parent=this;
                this.nextri=noderi;
            }else{
                this.nextri=null;
            }
        }       
    }
}
全部评论

相关推荐

勇敢的联想人前程似锦:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务