百度真题之走迷宫

题目:

给定一个矩阵,元素1表示可走路径,0表示不可走路径,从左上角开始,目标是值为9的坐标点,判断是否有一个路径到达目的地。如:

1 0 0 0 1 0

1 1 0 0 1 0

0 1 1 9 0 0

0 0 0 1 0 0

该矩阵存在到达数值为9的点的路径

分析:

这题和上一题城市规划的思路一致,只不过这里只要选取左上角第一个点即可。将已搜索的点放入到一个list。

代码:

package project001;
import java.util.ArrayList;
import java.util.List;

public class Main14 {

    public static List<int[]> markedList = new ArrayList<int[]>();//存放已搜索的点
    public static List<int[]> routeList = new ArrayList<int[]>();//存储路径,路径是由终点到起点
    public static void main(String[] args) {

        int[][] maze = {{1,1,0,0,0},
                        {0,1,0,0,0},
                        {0,1,1,1,0},
                        {1,1,0,9,0},
                        {0,1,0,1,1}};

        System.out.println(getRoute(fillM(maze)));
        printRoute(routeList);
    }
    public static boolean getRoute(int[][] M){
        markPoint(1,1,M);
        //当routeList的大小大于1,说明存在路径到达目标
        return routeList.size()>0;
    }

    public static int[][] fillM(int[][] M){
        int row = M.length;
        int col = M[0].length;
        int[][] M2 = new int[row+2][col+2];
        for(int i = 1;i<=row;i++){
            for(int j=1;j<=col;j++){
                M2[i][j]=M[i-1][j-1];
            }
        }
        return M2;
    }

    //判断该点是否被标记
    public static boolean isMarked(int i,int j){
        int size = markedList.size();
        if(size<=0) return false;
        for(int k=0;k<size;k++){
            int[] m = markedList.get(k);
            if(m[0]==i&&m[1]==j) return true;
        }
        return false;
    }

    public static boolean markPoint(int i,int j,int[][] M){if(isMarked(i,j)) return false;

        //将该点标记,即放入一个list内
        int[] m = new int[]{i,j};
        markedList.add(m);

        if(M[i][j]==9) {
            routeList.add(m);
            return true;
        }

        //标记与点(i,j)相邻并且未被标记的点
        if(!isMarked(i-1,j)&&M[i-1][j]>=1){
            boolean res = markPoint(i-1,j,M);
            //当res为true,说明点(i,j)是正确路径点
            if(res){
                int[] m2 = new int[]{i-1,j-1};//之所以存放的点坐标为(i-1,j-1),是因为当前矩阵是原来矩阵扩充后的,所以真实路径坐标比(i,j)要小1.
                routeList.add(m2);
                return true;
            }
        }
        if(!isMarked(i,j-1)&&M[i][j-1]>=1) {
            boolean res = markPoint(i,j-1,M);
            if(res){
                int[] m2 = new int[]{i-1,j-1};
                routeList.add(m2);
                return true;
            }
        }
        if(!isMarked(i,j+1)&&M[i][j+1]>=1){
            boolean res = markPoint(i,j+1,M);
            if(res){
                int[] m2 = new int[]{i-1,j-1};
                routeList.add(m2);
                return true;
            }
        }
        if(!isMarked(i+1,j)&&M[i+1][j]>=1){
            boolean res = markPoint(i+1,j,M);
            if(res){
                int[] m2 = new int[]{i-1,j-1};
                routeList.add(m2);
                return true;
            }
        }

        return false;
    }
    //打印矩阵
    public static void printM(int[][] m){
        int row = m.length;
        int col = m[0].length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                System.out.print(m[i][j]+" ");
            }
            System.out.println("");
        }
    }

    //打印坐标
    public static void printRoute(List<int[]> list){
        int size = list.size();
        if(size<=0) return;
        for(int i=size-1;i>=0;i--){
            int[] m =list.get(i);
            System.out.print("("+m[0]+","+m[1]+")-->");
        }
        System.out.println("");
    }

}
时间: 2024-12-23 18:47:09

百度真题之走迷宫的相关文章

【每天一道算法题】走迷宫

输入描述: 输入包含多组数据. 每组数据包含一个10*10,由“#”和“.”组成的迷宫.其中“#”代表墙:“.”代表通路. 入口在第一行第二列:出口在最后一行第九列. 从任意一个“.”点都能一步走到上下左右四个方向的“.”点. 输出描述: 对应每组数据,输出从入口到出口最短需要几步. 输入例子: #.#########........##........##........##........##........##........##........##........#########.#

百度真题之城市规划(连通域数目)

题目: 给出一个二维矩阵,矩阵元素为1或0,计算由1构成的独立不连通的区域数目,斜角为1也算连通.如以下矩阵: 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 连通域的个数为2. 分析: 建立一个集合list保存已经标记的坐标,循环遍历每一个点,当该点的值为1并且未被标记的话,将该点标记,并标记与该点相邻的点(使用递归,可以标记与该点连通的所有点). 以下代码: package project001; import java.util.ArrayList; import

# 清北冬令营真题泛做

清北冬令营真题泛做 前言 这段时间为了准备冬令营把清北冬令营真题都做了一下.更个博回顾一下(免得你们老说我咕咕咕). 先写良心PKU的题再写THU的题, 主要是THU的题和PKU比起来真的毒瘤好多...... PKUWC2018 [PKUWC2018]Minimax 一个比较显然的暴力是归并排序,每次直接前后缀计算答案即可. 为啥不用线段树合并代替归并排序呢? 暴力线段树合并,合并的过程中顺便算一下即可,由于权值区间不交所以复杂度一个\(log\). [PKUWC2018]Slay the Sp

第三届蓝桥杯 c/c++真题

第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多循环的只是,还有模拟,动态规划的只是. 其中做题过程中,也有了一些新的体会.起初做代码填空题的时候我没办法知道自己做的是对还是错,就跑到网上查答案,后来发现,题目已经给出了代码,起始我们可以自己加上头文件,然后把空缺的代码加上进行调试的,这样就可以验证自己补充的代码是否正确了. 此外在进行调试的时候

第四届蓝桥杯 c/c++真题

第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天.这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日. 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日. 高斯获得博士学位的那天日记上标着:

走迷宫(一)

题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=58 有关深搜广搜知识的PPT讲解链接(1)http://wenku.baidu.com/link?url=uuVluDfJP-gW6FiV0F8J4s4VuEOU__uqW1nFjuOO-id9ntGdqXLLvwDN0eR3akZMKP_iBmA0xPGAE-SOwdWyN21HJoXrHbd7cvSx2zRkZBa (2)http://wenku.baidu.com/view/672

2016年上半年系统集成项目管理工程师考试真题(下午)

做真题是掌握考试重点以及把握考试方向的的最佳方式,因而考试真题和答案是最好的学习资料,下面希赛软考学院为您提供2016年上半年系统集成项目管理工程师考试下午试卷题目,供您参考学习. 2016年上半年系统集成项目管理工程师考试下午试题提目 试题一(20分) 阅读下列说明,回答问题1至问题4,将解答填入答题纸的对应栏内. [说明] 已知某信息工程项目由A至1共9个活动构成,项目组根据项目目标,特别是工期要求,经过分析.定义及评审,给出了该项目的活动历时.活动所需资源及活动逻辑关系列表,如下表所示:

nyoj306 走迷宫(搜索+二分)

题目306 题目信息 运行结果 本题排行 讨论区 走迷宫 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲.这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫.整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度. 这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线.走迷宫的取胜规则很有意思,看

Java --- 走迷宫

走迷宫需要考虑大量的实验和错误:沿着一条路径走,当不能再向前走时回溯,然后尝试另一条以前没尝试过的选择.可是使用递归算法. //********************************************************** // MaseSearch.java //********************************************************** public class MaseSearch { public static void ma