迷宫问题的研究与实现

【问题描述】

以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

(1)根据二维数组,输出迷宫的图形。

(2)探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径。

【算法分析】

主要考查数据结构-栈。栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

详细请看百度百科: http://baike.baidu.com/subview/38877/12246229.htm?fr=aladdin

【实现分析】

可使用回溯方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。

【代码展示】

1.首先创建一个Point类:

package com.albertshao.study;  

public class Point {  

    private int x;  

    private int y;  

    public Point() {  

    }  

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }  

    @Override
    public String toString() {
        return "Point [x=" + x + ", y=" + y + "]";
    }  

    public int getX() {
        return x;
    }  

    public void setX(int x) {
        this.x = x;
    }  

    public int getY() {
        return y;
    }  

    public void setY(int y) {
        this.y = y;
    }  

}

迷宫类:

package com.albertshao.study;  

import java.util.Scanner;
import java.util.Stack;  

public class Maze {  

    int maze[][];
    private int row = 3;
    private int col = 3;
    Stack<Point> stack;
    boolean p[][] = null;  

    public Maze() {  

        maze = new int[15][15];
        stack = new Stack<Point>();
        p = new boolean[15][15];
    }  

    /* 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
     * construct the maze
     */
    public void init() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入迷宫的行数");
        row = scanner.nextInt();
        System.out.println("请输入迷宫的列数");
        col = scanner.nextInt();
        System.out.println("请输入" + row + "行" + col + "列的迷宫");
        int temp = 0;
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                temp = scanner.nextInt();
                maze[i][j] = temp;
                p[i][j] = false;
            }
        }
    }  

    /*
     * list, decide whether there is a road.
     */
    public void findPath() {  

        int temp[][] = new int[row + 2][col + 2];
        for (int i = 0; i < row + 2; ++i) {
            for (int j = 0; j < col + 2; ++j) {
                temp[0][j] = 1;
                temp[row + 1][j] = 1;
                temp[i][0] = temp[i][col + 1] = 1;
            }
        }  

        for(int i = 0; i < row + 2; i ++)
        {
            for(int j = 0; j < col + 2; j ++)
            {
                System.out.print(temp[i][j] + " ");  

            }
            System.out.println();
        }  

        // copy the original maze to the new temp.
        for (int i = 0; i < row; ++i) {
            for (int j = 0; j < col; ++j) {
                temp[i + 1][j + 1] = maze[i][j];
            }
        }  

        System.out.println("after copying data");
        for(int i = 0; i < row + 2; i ++)
        {
            for(int j = 0; j < col + 2; j ++)
            {
                System.out.print(temp[i][j] + " ");  

            }
            System.out.println();
        }
        //from up-left to skip in the clockWise direction  

        int i = 1;
        int j = 1;
        p[i][j] = true;
        stack.push(new Point(i, j));
        while (!stack.empty() && (!(i == (row) && (j == col)))) {  

            if ((temp[i][j + 1] == 0) && (p[i][j + 1] == false)) { //turn right
                p[i][j + 1] = true;
                stack.push(new Point(i, j + 1));
                j++;
            } else if ((temp[i + 1][j] == 0) && (p[i + 1][j] == false)) {  // turn down
                p[i + 1][j] = true;
                stack.push(new Point(i + 1, j));
                i++;
            } else if ((temp[i][j - 1] == 0) && (p[i][j - 1] == false)) {  // turn left
                p[i][j - 1] = true;
                stack.push(new Point(i, j - 1));
                j--;
            } else if ((temp[i - 1][j] == 0) && (p[i - 1][j] == false)) { // turn up
                p[i - 1][j] = true;
                stack.push(new Point(i - 1, j));
                i--;
            } else {
                stack.pop();
                if (stack.empty()) {
                    break;
                }
                i = stack.peek().getX();
                j = stack.peek().getY();
            }  

        }  

        Stack<Point> newPos = new Stack<Point>();
        if (stack.empty()) {
            System.out.println("没有路径");
        } else {
            System.out.println("有路径");
            System.out.println("路径如下:");
            while (!stack.empty()) {
                Point pos = new Point();
                pos = stack.pop();
                System.out.print("("+pos.getX() + "," + pos.getY()+") ");
                newPos.push(pos);
            }
        }  

        /*
         * print the path
         */

        String resault[][] = new String[row + 1][col + 1];
        for (int k = 0; k < row; ++k) {
            for (int t = 0; t < col; ++t) {
                resault[k][t] = (maze[k][t]) + "";
            }
        }
        while (!newPos.empty()) {
            Point p1 = newPos.pop();
            resault[p1.getX() - 1][p1.getY() - 1] = "#";  

        }  

        for (int k = 0; k < row; ++k) {
            for (int t = 0; t < col; ++t) {
                System.out.print(resault[k][t] + "\t");
            }
            System.out.println();
        }
    }  

    public static void main(String []args)
    {
        Maze maze = new Maze();
        maze.init();
        maze.findPath();
    }
}

测试结果:

请输入迷宫的行数
3
请输入迷宫的列数
3
请输入3行3列的迷宫
0 1 0
0 0 1
1 0 0
1 1 1 1 1
1 0 0 0 1
1 0 0 0 1
1 0 0 0 1
1 1 1 1 1
after copying data
1 1 1 1 1
1 0 1 0 1
1 0 0 1 1
1 1 0 0 1
1 1 1 1 1
有路径
路径如下:
(3,3)
(3,2)
(2,2)
(2,1)
(1,1)
#   1   0
#   #   1
1   #   #

备注:部分代码借鉴于网友。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, scanner
, close() scanner java
, 迷宫
, stack
, system
, public
, temp
, 迷宫路径输出问题
, scanner string
, for数据int
数据结构 迷宫问题
用栈实现迷宫问题、c 用栈实现迷宫问题、搜索算法实现迷宫问题、mfc 实现迷宫小游戏、走迷宫游戏的java实现,以便于您获取更多的相关知识。

时间: 2024-09-18 21:25:10

迷宫问题的研究与实现的相关文章

漏洞挖掘的高级方法

前言 在此文中我将讲述我在软件漏洞挖掘的实践中学到的技术及方法,不过这些内容并非那些前沿的技术,大多是基础类型的技术及方法.对于初学者而言,希望能够给予入门的指导,对于经验丰富的漏洞挖掘工作者而言,我认为也可以从中获得一些启发. 受限于我个人的知识水平及能力,这篇文章并不可能做到面面俱到,也希望阅读者能够与我积极交流,对于其中的错误不吝赐教. 我将会把此文分为三个章节,分别阐述我的观点.首先我会从一个较高的角度总结于我眼中何谓漏洞挖掘;然后详细讨论在软件漏洞挖掘过程中我们需要掌握的技能以及需要的

算法研究:堆栈与深度优先搜索(迷宫问题)

堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈 顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素. 现在我们用堆栈解决一个有意思的问题,定义 一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫,其中的1表示墙壁,0表示可以走 的路,只能横着走或

【浙大脑机接口实验室探秘】人类与AI控制大鼠走出迷宫,C10背负的混合智能未来(视频)

(文/杨静 )我对浙江大学的脑机接口研究长久以来抱有朝圣般的浓厚兴趣,主要是受浙江大学计算机学院潘纲教授的影响.他在一次演讲里展示了脑控大鼠在一名研究人员的脑电波控制下,快速走迷宫的神奇现场,这只大鼠是在中央电视台的节目里表演走迷宫的.当时现场一位嘉宾跟我交流说,他去浙江大学的实验室参观过这只脑控大鼠,据他观察这只大鼠受人类操控走迷宫时,他感觉动作比较机械,更像一个机器而不是一个动物.他的话更引发了我的好奇,一定要想办法去看看这只大鼠,到底是不是已经演化成"机器"了. 浙大的超级明星

【&amp;amp;#9733;】Web精彩实战之&amp;amp;lt;智能迷宫&amp;amp;gt;

JS精彩实战之<智能迷宫>       ---宝贵编程经验分享会---               hello大家好,这里是Web云课堂,之前的一年里我们经历了Html和CSS的系统攻城,此时的你们已经是做静态(动静结合)网页的高手了,本堂课的主讲师JimJin将带领大家进入成为Web安全专家的第4阶段第三小节:JavaScript的实战实验.本节课我将演示如何运用Web编程语言JS来制作一个完整的系统的网页应用程序,相比之前的理论和小实验,本次的任务将是前所未有的巨大,因为我们要做的是一个系

回顾:十大重要的脑科学研究

近10年来,人们对大脑的认知迅速增长.诊断和分子技术的巨大发展已经揭开了一些大脑的奥秘,科学家正开始解析这些重大发现,并用于对应日常行为甚至疾病.<科学美国人>专版回顾了重要的10个脑科学研究,以及它们的重大贡献. 科学家兼作家Lyall Watson曾经说过:"我们永远无法理解大脑."在人类的头颅中上亿个不断发出电信号的神经元组成密密麻麻的网络,已经困扰了科学家几个世纪.然而,近10年来,人们对这个神秘器官的认知迅速增长.诊断和分子技术的巨大发展已经揭开了一些大脑的奥秘,

网站设计心理学与音乐研究:设计好脾气的Web页面

中介交易 SEO诊断 淘宝客 云主机 技术大厅 感觉已经连续下了九百多天的雨了,身上也仿佛即将生出苔藓与蘑菇.Down your sister's rain...淡定着,说正事儿.本篇译文其实在春节之前就有所着手,不过期间连续看到了几篇更想做的,于是相当没有节操的见异思迁了.今次恰逢母难日,抓紧时间补回来.走起. 随着技术的进步,Web设计的理念与技法也在不断发展.设备种类越来越多,带给我们的挑战也越来越大.怎样以最合理的方式使设计方案能够最大程度地适应各种设备的性能与规格属性,这是我们在工作当

【重磅】Nature子刊 | 增强学习强化,混合脑生化鼠“走迷宫”能力大幅提升

神经科学和计算机科学的发展加强了大脑和机器之间的融合,现在可以用机械的方式对生物的感觉.记忆和运动机能进行增强或修复,科学家也做出了动物机器人和嵌入生物大脑的认知机器人.诸如此类的生物智能与人工智能相结合,使人不禁思考:这样的混合系统是否比单独的生物系统更加智能? 为了解决这个问题,浙江大学吴朝晖课题组的研究人员率先进行了这样的实验,他们使用采用了机器学习规则的计算系统增强小鼠的大脑,然后观察这样的混合系统是否在学习走迷宫的任务中具有更强的学习能力. 论文摘要:混合脑机系统的迷宫学习 摘要 推动

网络间谍活动月光迷宫已演变成Turla

Thomas Rid经过大量的调查分析,在近期的安全分析师峰会(SAS)报告中指出:Moonlight Maze(月光迷宫)网络间谍们已经演变成了目前的Turla. 网络间谍活动月光迷宫已演变成Turla-E安全 1996年10月7日,美国科罗拉多矿业大学遭遇网络入侵.入侵者利用设备上安装的SUN OS4操作系统中的漏洞袭击了一台位于该校布朗大楼(Brown Building)内.昵称为"Baby_Doe"的电脑.他们通过这台电脑辗转进入美国国家航空航天局.美国海军和空军总部及遍及全美

研究称学习新知识后打盹有助加深记忆

美国研究人员发现,学习新事物之后打个盹是个好习惯.如果梦到之前的学习内容,可以加深记忆.增强学习效果. 相关研究成果发表在最新一期<当代生物学>杂志上. 冲出"迷宫" 美国哈佛大学研究人员征集99名志愿者参与实验,要求他们学习电脑屏幕上出现的3D迷宫布局,以便几小时后找到虚拟空间出口. 学习结束后,研究人员允许半数实验对象小睡两小时,另一半人可以回想学习内容,但不能入睡.5小时后,全部受试者重新"进入"迷宫寻找出口. 研究人员发现,有4名受试者梦到迷宫任