Java实现走迷宫回溯算法

以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
(1) 根据二维数组,输出迷宫的图形。
(2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径。

例子:
左上角(1,1)为入口,右下角(8,9)为出口。

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

import java.util.*;

class Position{
  public Position(){

  }

  public Position(int row, int col){
    this.col = col;
    this.row = row;
  }

  public String toString(){
    return "(" + row + " ," + col + ")";
  }

  int row;
  int col;
}

class Maze{
  public Maze(){
    maze = new int[15][15];
    stack = new Stack<Position>();
    p = new boolean[15][15];
  }

  /*
   * 构造迷宫
   */
  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;
      }
    }
  }

  /*
   * 回溯迷宫,查看是否有出路
   */
  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; ++i) {
      for(int j = 0; j < col; ++j) {
        temp[i + 1][j + 1] = maze[i][j];
      }
    }
    // 从左上角开始按照顺时针开始查询

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

      if ((temp[i][j + 1] == 0) && (p[i][j + 1] == false)) {
        p[i][j + 1] = true;
        stack.push(new Position(i, j + 1));
        j++;
      } else if ((temp[i + 1][j] == 0) && (p[i + 1][j] == false)) {
        p[i + 1][j] = true;
        stack.push(new Position(i + 1, j));
        i++;
      } else if ((temp[i][j - 1] == 0) && (p[i][j - 1] == false)) {
        p[i][j - 1] = true;
        stack.push(new Position(i, j - 1));
        j--;
      } else if ((temp[i - 1][j] == 0) && (p[i - 1][j] == false)) {
        p[i - 1][j] = true;
        stack.push(new Position(i - 1, j));
        i--;
      } else {
        stack.pop();
        if(stack.empty()){
          break;
        }
        i = stack.peek().row;
        j = stack.peek().col;
      }

    }

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

    /*
     * 图形化输出路径
     * */

    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()) {
      Position p1=newPos.pop();
      resault[p1.row-1][p1.col-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();
    }

  }

  int maze[][];
  private int row = 9;
  private int col = 8;
  Stack<Position> stack;
  boolean p[][] = null;
}

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

运行示例:

请输入迷宫的行数
3
请输入迷宫的列数
3
请输入3行3列的迷宫
0 1 1
0 0 1
1 0 0

有路径
路径如下:

请输入迷宫的行数
9
请输入迷宫的列数
8
请输入9行8列的迷宫
0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0
0 0 1 0 1 1 0 1
0 1 1 1 0 0 1 0
0 0 0 1 0 0 0 0
0 1 0 0 0 1 0 1
0 1 1 1 1 0 0 1
1 1 0 0 0 1 0 1
1 1 0 0 0 0 0 0

有路径
路径如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • java实现单词搜索迷宫游戏
  • Java编写迷宫小游戏
  • Java遗传算法之冲出迷宫
  • java图的深度优先遍历实现随机生成迷宫
  • 使用栈的迷宫算法java版代码
(0)

相关推荐

  • java图的深度优先遍历实现随机生成迷宫

    最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想就是,迷宫中的每个点都有四面墙,然后呢. 1.从任意一点开始访问(我的算法中固定是从(0,0)点开始),往四个方向中的随机一个访问(每访问到一个可访问的点,就去掉该点的那个方向的墙),被访问点继续以这种方识向下进行访问. 2.对每个被访问的点都被标识为已访问,当一个点对某个方向进行访问时我们首先会判断被访问点是否已被访问,或者触到边界.如果该点四个方向皆已访

  • 使用栈的迷宫算法java版代码

    本文为大家分享了使用栈的迷宫算法java版,主要考察栈的使用,供大家参考,具体内容如下 主要思路如下: do { if(当前位置可通过) { 标记此位置已走过; 保存当前位置并入栈; if(当前位置为终点) { 程序结束; } 获取下一个位置; } else { if(栈非空) { 出栈: while(当前位置方向为4且栈非空) { 标记当前位置不可走; 出栈; } if(当前位置的方向小于4) { 方向+1; 重新入栈; 获取下一个位置; } } } } while (栈非空); java代码

  • java实现单词搜索迷宫游戏

    本文实例讲述了java实现单词搜索迷宫游戏.分享给大家供大家参考.具体分析如下: 我们在杂志上,经常能够看到找单词的小游戏,在一个二维表格中,存在各种字母,我们可以从八个方向找单词.这个用计算机处理十分方便,但是,算法的好坏很重要,因为要是用蛮力算法实现,那么耗费的时间是不可想象的. 这是数据结构与问题求解Java语言描述一书中给的实现思路 完整代码如下,注释写的很明白了 import java.io.BufferedReader; import java.io.FileReader; impo

  • Java遗传算法之冲出迷宫

    遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法.它能解决很多问题,比如数学方程的最大最小值,背包问题,装箱问题等.在游戏开发中遗传算法的应用也十分频繁,不少的游戏 AI 都利用遗传算法进行编码. 就个人理解,遗传算法是模拟神奇的大自然中生物"优胜劣汰"原则指导下的进化过程,好的基因有更多的机会得到繁衍,这样一来,随着繁衍的进行,生物种群会朝着一个趋势收敛.而生物繁衍过程中的基因杂交和变异会给种群提供更好的基因序列

  • Java编写迷宫小游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树是比较合适的,从根节点到每一个子节点都只有一条路径.假设入口是根节点,出口是树中某个子节点,那么,从根节点到该子节点的路径肯定是唯一的. 所以如果能构造一棵树把所有的格子都覆盖到,也就能够做出一个迷宫了. 另外还要求树的父节点和子节点必须是界面上相邻的格子. 在界面显示时,父节点和子节点之间共用的边

  • Java实现走迷宫回溯算法

    以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论. (1) 根据二维数组,输出迷宫的图形. (2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径. 例子: 左上角(1,1)为入口,右下角(8,9)为出口. 可使用回溯方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进:否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通

  • java 实现迷宫回溯算法示例详解

    用一个7 x 7的矩形表示迷宫,0和1分别表示的是通路和障碍.通过设计编写程序找到蓝色小球达到蓝色旗子的路线 思路: 构建一个迷宫(用二维数组)实现找通路的方法findRoad() 构建二维数组不难,我们主要是要实现findRoad()这个方法,在实现这个方法前,我们需要约定好一下几个点:小球的位置当作入口(1,1),小旗的位置当作出口(5,5)数组里数的含义分别为(0没有走过).(1障碍).(2走过且为正确的路线).(3走过且为错误的路线)将我们每一步的走法称为策略:下 -> 右 -> 上

  • Python解决走迷宫问题算法示例

    本文实例讲述了Python解决走迷宫问题算法.分享给大家供大家参考,具体如下: 问题: 输入n * m 的二维数组 表示一个迷宫 数字0表示障碍 1表示能通行 移动到相邻单元格用1步 思路: 深度优先遍历,到达每一个点,记录从起点到达每一个点的最短步数 初始化案例: 1   1   0   1   1 1   0   1   1   1 1   0   1   0   0 1   0   1   1   1 1   1   1   0   1 1   1   1   1   1 1 把图周围加上

  • 如何利用JAVA实现走迷宫程序

    本Demo使用三个类 一个Test类 一个自定义的Stack类 一个自定义的Queue类 可以实现的功能: 1.对于一个写在文本文件中的迷宫,能够将其转换为二维数组用广度优先搜索实现查找最短路径 2.可以不定义迷宫的入口和出口,能自动查找到出入口 前提是要有一个对应路径的.txt文件 这里举个例子吧,我的是"F:/1号迷宫(0,18).txt"路径下 运行结果 示例代码 注释写的很详细,这里就不多赘述了 package com; import java.io.BufferedReade

  • java回溯算法解数独问题

    本文实例为大家分享了java回溯算法解数独问题,供大家参考,具体内容如下 下面来详细讲一下如何用回溯算法来解数独问题. 下图是一个数独题,也是号称世界上最难的数独.当然了,对于计算机程序来说,只要算法是对的,难不难就不知道了,反正计算机又不累.回溯算法基本上就是穷举,解这种数独类的问题逻辑比较简单. 不管算法懂不懂,先把类建出来,变量定义好,那放大学试卷上就是可以拿两分了. package shudu; /** * Created by wolf on 2016/3/17. */ public

  • 浅谈Java实现回溯算法之八皇后问题

    目录 一.前言 二.浅谈递归 三.回溯算法 四.八皇后问题 五.八皇后变种 六.总结 一.前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 二.浅谈递归 对于递归算法,我觉得掌握递归是入门数据结构与算法的关键,因为后面学习很多操作涉及到递归,例如链表的一些操作.树的遍历和一些操作.图的dfs.快排.归并排序等等. 递归的实质还是借助栈实现一些操作,利用递归能够完成的操作使用栈都能够完成,并且利用栈的话可以很好的控制停止,效率

  • Java数据结构 递归之迷宫回溯案例讲解

    问题介绍: 用二维数组表示一个迷宫,设置迷宫起点和终点,输出迷宫中的一条通路 实现思路: 二维数组表示迷宫: 0表示路且未走过.1表示墙.2表示通路,3表示已经走过但走不通 设置寻路方法setWay,传入地图和坐标参数 默认方向策略:下.右.上.左 假定传入的店没有走过且可以走通,将其值置为2,然后向下寻路,也就是将坐标 (i + 1, j) 传入寻路方法中 进行递归寻路,向下移动后,再次按照方向策略进行寻路,即再向下寻路,直到遇到死路,即下右左均走不通(因为将走过的路置为2,故向上也走不通,即

  • Java实现可视化走迷宫小游戏的示例代码

    目录 效果图 数据层 视图层 控制层 效果图 数据层 本实例需要从 .txt 文件中读取迷宫并绘制,所以先来实现文件读取IO类 MazeData.java,该程序在构造函数运行时将外部文件读入,并完成迷宫各种参数的初始化,注意规定了外部 .txt 文件的第一行两个数字分别代表迷宫的行数和列数.此外还提供了各类接口来读取或操作私有数据. import java.io.BufferedInputStream; import java.io.File; import java.io.FileInput

  • Java基于循环递归回溯实现八皇后问题算法示例

    本文实例讲述了Java基于循环递归回溯实现八皇后问题.分享给大家供大家参考,具体如下: 运行效果图如下: 棋盘接口 /** * 棋盘接口 * @author Administrator * */ public interface Piece { abstract boolean isRow(int line); abstract boolean isCol(int line,int col); } 棋盘类: /** * 棋盘 * @author Administrator * */ public

  • Python基于分水岭算法解决走迷宫游戏示例

    本文实例讲述了Python基于分水岭算法解决走迷宫游戏.分享给大家供大家参考,具体如下: #Solving maze with morphological transformation """ usage:Solving maze with morphological transformation needed module:cv2/numpy/sys ref: 1.http://www.mazegenerator.net/ 2.http://blog.leanote.com

随机推荐