题解 | #迷宫问题##bfs##dfs#

迷宫问题

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

BFS(Java)

  • 通过队列进行广度遍历,然后保存坐标和父节点

DFS(Java)

  • 递归 + 回溯
import java.util.*;
class Node{
    public int x,y,step;
    Node fa;
    Node(){}
    Node(int x,int y,int step){
        this.x = x;
        this.y = y;
        this.step = step;
    }
    Node(int x,int y,int step,Node fa){
        this.x = x;
        this.y = y;
        this.step = step;
        this.fa = fa;
    }
}
public class Main{
    public static void bfs(int [][]vis, int [][]graph,int n, int m){
        int [][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
        LinkedList<Node> q = new LinkedList<>();
        Node niu = new Node();
        q.offer(new Node(0,0,0,null));
        vis[0][0] = 1;
        while(!q.isEmpty()){
            Node node = q.poll();
            for(int i = 0;i<4;i++){
                int x = node.x + dir[i][0];
                int y = node.y + dir[i][1];
                if(x<n && x>=0 && y < m && y>=0 && graph[x][y]==0 && vis[x][y]==0){
                    vis[x][y] = 1;
                    q.offer(new Node(x,y,node.step+1,node));
                    if(x==n-1&&y==m-1) niu = new Node(x,y,node.step+1,node);
                }                  
            }
        }
        List<int[]> list = new ArrayList<>();
        while(niu!=null){
            int [] t = new int[2];
            t[0] = niu.x;
            t[1] = niu.y;
            list.add(t);
            niu = niu.fa;
        }
        Collections.reverse(list);
        for(int i=0;i<list.size();i++) System.out.println("("+list.get(i)[0]+","+list.get(i)[1]+")");
        
    }
    static int min = Integer.MAX_VALUE;
    static Node st;
    
    public static void dfs(int x,int y, int step,int [][] graph, int [][] vis, Node fa){
        int n = graph.length;
        int m = graph[0].length;
        if(x==n-1 && y==m-1) {
            if(min>step){
                min = step;
                st = new Node(x,y,step,fa);
            }
            return ;
        }
        int [][] dir = {{-1,0},{0,1},{1,0},{0,-1}};
        for(int i = 0;i<4;i++){
            vis[x][y] = 1;
            int xx = x + dir[i][0];
            int yy = y + dir[i][1];
            if(xx<n && xx>=0 && yy < m && yy>=0 && graph[xx][yy]==0 && vis[xx][yy]==0){
                dfs(xx, yy, step+1, graph, vis, new Node(x,y,step,fa));
            }
            vis[x][y] = 0;  
        }
    }
    public static void main(String []args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int [][] graph = new int [n][m];
        int [][] vis = new int[n][m];
        for(int i = 0 ;i<n;i++){
            for(int j = 0;j<m;j++){
                graph[i][j] = sc.nextInt();
            }
        }
//         bfs(vis, graph,n,m); // 广度优先
        dfs(0, 0, 0, graph, vis, null); // 深度优先
//         System.out.println(min);
        List<int[]> list = new ArrayList<>();
        while(st!=null){
            int [] t = new int[2];
            t[0] = st.x;
            t[1] = st.y;
            list.add(t);
            st = st.fa;
        }
        Collections.reverse(list);
        for(int i=0;i<list.size();i++) System.out.println("("+list.get(i)[0]+","+list.get(i)[1]+")");
        
        
    }
}
全部评论

相关推荐

秋招结束已经一段时间了&nbsp;一直在忙着毕业的事情&nbsp;浅浅总结一下自己的秋招经历吧~本人BG双非硕&nbsp;后端选手&nbsp;有一段小厂+腾讯暑期实习腾讯暑期转正loser秋招结束已经结束了有一段时间了总结一下秋招历程最大的感受就是秋招比起暑期更加卡学历秋招总共投了60多家吧一直面&nbsp;一直挂也投了两家银行科技岗&nbsp;都走到终面体检了都拒了(总体感觉本地的银行还是挺容易过的)可能本人更想去私企&nbsp;并且银行也挺卷听说一直到11月就只有一家小厂的offer并签约当保底然后也突然被WXG捞了&nbsp;本来都不对腾讯抱有希望了可能经过一整个秋招的面试积累吧&nbsp;以及本人有ACM经历&nbsp;WXG整体面试以做题偏多(一二面做了5道题&nbsp;4道hard)&nbsp;比较合自己胃口&nbsp;差不多半个月就把五轮面试过了进入录用评估&nbsp;但也一直没有结果到后面也陆陆续续有几家中厂也终面过泡池子一直到12月初华子给开了base杭州&nbsp;14a因为华子公积金的原因&nbsp;和小厂薪资上差距不大&nbsp;所以也一直犹豫是否毁约签华子&nbsp;但是内心也还对WXG抱有一丝幻想(虽然一直没有保温也没有任何消息)然后一直到12月中下旬&nbsp;华子要求去现场签约了&nbsp;但是WXG还是没有消息&nbsp;然后就连续发邮件和打电话催了好多次&nbsp;还是回复耐心等待直到华子签约那天&nbsp;经过内心挣扎已经决定毁约签华子了&nbsp;可能还是想平台更大一点吧&nbsp;然后最戏剧性的一幕来了&nbsp;就在我发毁约邮件没有5秒&nbsp;WXG打电话开奖了&nbsp;并且开奖也十分有诚意&nbsp;最终还是没有签约成功华子&nbsp;研究生期间也打了很多次华子的比赛还是对华子有感情的555整个秋招都是伴随着焦虑的&nbsp;我认为自己也是秋招大部分人的画像&nbsp;屡屡碰壁后不断怀疑自己&nbsp;但是可能自己也比较幸运吧&nbsp;但是也感谢自己在一次次陷入迷茫都没有放弃自己&nbsp;还是一直努力背八股&nbsp;刷题也祝各位牛友们共勉&nbsp;就算暂时没有好的offer&nbsp;不放弃一定会有好的结果的!!
点赞 评论 收藏
分享
01-19 12:48
门头沟学院 C++
只想搞钱的鸽子很喜欢...:混账是很多的,还有那些在自己风华正茂的年纪说风凉话讥讽那些下岗前员工的。这些人都是现在职场环境这么烂的帮凶
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务