本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下
项目名称
寻找迷宫出路
项目描述
给定一个自定义迷宫,0表示能通过,1表示不能通过。通过程序找出正确的迷宫出路,并将正确的路线改为2输出。
代码实现
测试类
public class Test { public static void main(String[] args) { Maze maze = new Maze(); maze.begin(); } }
主类:实现主方法
public class Maze { private MazeNode[][] mazeNodes; private int row; private int col; private Stack<MazeNode> stack = new Stack<>(); private static Scanner scanner = new Scanner(System.in); public Maze(){ System.out.println("请输入行列数"); row = scanner.nextInt(); col = scanner.nextInt(); mazeNodes = new MazeNode[row][col]; } public void initValue(){ System.out.println("输入迷宫路径:"); for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ // i j mazeNodes[i][j] = new MazeNode(scanner.nextInt(),i,j); } } } //2. 根据当前节点的四个方向上面的value值 // 初始化当前节点的四个方向行走状态 public void initWayState(){ for(int i=0;i<row;i++){ for(int j=0;j<col;j++){ //i j if(mazeNodes[i][j].getValue()==0){ //东 :看东边节点的值是0 if(j+1<col && mazeNodes[i][j+1].getValue() == 0){ // 将当前节点i j 的东边方向设置成可走状态 mazeNodes[i][j].setWayState(Constant.WAY_EAST,Constant.WAY_ABLE); } //西 if(j-1>0 && mazeNodes[i][j-1].getValue() == 0){ mazeNodes[i][j].setWayState(Constant.WAY_WEST,Constant.WAY_ABLE); } //南 if(i+1<row && mazeNodes[i+1][j].getValue() == 0){ mazeNodes[i][j].setWayState(Constant.WAY_SOUTH,Constant.WAY_ABLE); } //北 if(i-1>0 && mazeNodes[i-1][j].getValue() == 0){ mazeNodes[i][j].setWayState(Constant.WAY_NORTH,Constant.WAY_ABLE); } } } } } //走迷宫 public void goMaze(){ if(mazeNodes[0][0].getValue()!=0){ System.out.println("没有迷宫路径"); return; } stack.push(mazeNodes[0][0]); while (!stack.isEmpty()) {//TODO:?????? MazeNode top = stack.peek(); //获取当前栈顶元素在二维数组中的行列坐标 int i = top.getI(); int j = top.getJ(); if(i == row-1 && j==col-1){ System.out.println("找到迷宫路径"); return; } //TODO: if(mazeNodes[i][j].getWayState(Constant.WAY_SOUTH) == Constant.WAY_DISABLE && mazeNodes[i][j].getWayState(Constant.WAY_EAST) == Constant.WAY_DISABLE && mazeNodes[i][j].getWayState(Constant.WAY_NORTH) == Constant.WAY_DISABLE && mazeNodes[i][j].getWayState(Constant.WAY_WEST) == Constant.WAY_DISABLE){ stack.pop(); } //东 else if (mazeNodes[i][j].getWayState(Constant.WAY_EAST)) { stack.push(mazeNodes[i][j + 1]); mazeNodes[i][j+1].setWayState(Constant.WAY_WEST,Constant.WAY_DISABLE); mazeNodes[i][j].setWayState(Constant.WAY_EAST,Constant.WAY_DISABLE); }//南 else if (mazeNodes[i][j].getWayState(Constant.WAY_SOUTH)) { //如果南边方向可走,将南边节点进行入栈操作 stack.push(mazeNodes[i + 1][j]); //封路1:将南边节点的回路(北边)方向封掉 mazeNodes[i+1][j].setWayState(Constant.WAY_NORTH,Constant.WAY_DISABLE); //封路2:将当前节点i,j 走过的路封掉 TODO: mazeNodes[i][j].setWayState(Constant.WAY_SOUTH,Constant.WAY_DISABLE); } //西 else if (mazeNodes[i][j].getWayState(Constant.WAY_WEST)) { stack.push(mazeNodes[i][j - 1]); mazeNodes[i][j-1].setWayState(Constant.WAY_EAST,Constant.WAY_DISABLE); mazeNodes[i][j].setWayState(Constant.WAY_WEST,Constant.WAY_DISABLE); } //北 else if (mazeNodes[i][j].getWayState(Constant.WAY_NORTH)) { stack.push(mazeNodes[i - 1][j]); mazeNodes[i-1][j].setWayState(Constant.WAY_SOUTH,Constant.WAY_DISABLE); mazeNodes[i][j].setWayState(Constant.WAY_NORTH,Constant.WAY_DISABLE); } // if(mazeNodes[i][j].getWayState(Constant.WAY_SOUTH) == Constant.WAY_DISABLE && // mazeNodes[i][j].getWayState(Constant.WAY_EAST) == Constant.WAY_DISABLE && // mazeNodes[i][j].getWayState(Constant.WAY_NORTH) == Constant.WAY_DISABLE && // mazeNodes[i][j].getWayState(Constant.WAY_WEST) == Constant.WAY_DISABLE){ // stack.pop(); // } } } public void finish(){ while (!stack.isEmpty()) { MazeNode top = stack.peek(); top.setValue(2); stack.pop(); } System.out.println("迷宫路径为:"); int i = 0, j = 0; while (i<row){ for (j = 0; j < col; j++) { System.out.print(mazeNodes[i][j].getValue()+" "); } System.out.println(); i++; } } public void begin(){ initValue(); initWayState(); goMaze(); finish(); } // public void show(){ // for(int i=0;i<row;i++){ // for(int j=0;j<colum;j++){ // System.out.print(mazeNodes[i][j].value+" "); // } // System.out.println(); // } // } }
MazeNode:结点类,用于迷宫结点
public class MazeNode { private int i; private int j; private int value; private boolean[] wayState; public MazeNode(int value,int i,int j){ wayState = new boolean[Constant.WAYNUM]; this.value = value; this.i = i; this.j = j; } public int getValue() { return value; } public void setWayState(int direction,boolean isAble) { wayState[direction] = isAble; } public boolean getWayState(int direction) { return wayState[direction]; } public void setValue(int value){ this.value = value; } public int getI() { return i; } public int getJ() { return j; } }
Constant:常数类,方便使用
public class Constant { public static final int WAYNUM = 4; public static final int WAY_EAST = 0; public static final int WAY_WEST = 1; public static final int WAY_SOUTH = 2; public static final int WAY_NORTH = 3; public static final boolean WAY_ABLE = true; public static final boolean WAY_DISABLE = false; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
我想用递归法解迷宫。在下面的代码中,MazeCord是程序员创建的类型,它存储坐标类型位置。格式为mazecord(int x,int y)。现在编译时,我的程序会到达方法的某些部分,而忽略另一部分,因此在所有情况下都会显示“未找到路径”,并且只在LinkedList mazePath中存储开始位置。search()方法中有一个被注释掉的部分,这是我尝试的另一种方法,但我很确定它是错误的,不是这样
本文向大家介绍Java小项目之迷宫游戏的实现方法,包括了Java小项目之迷宫游戏的实现方法的使用技巧和注意事项,需要的朋友参考一下 项目要求: 一个网格迷宫由n行n列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示),你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格。任何时候都不能在有障碍物的单元格中,也不能走到迷宫之外,起点为左上角和终点右下角。 项
嗨~我被这个问题困住了。有人请帮帮我!!!! 问题是程序会要求用户输入一个4到20之间的数字来决定迷宫的大小。它稍后会要求用户逐行输入迷宫的内容并将其存储到2D bool数组中(true表示阻塞,false表示清除)。然后程序从左上角开始,并尝试找到一条通往右下角的路径(可以向右、向左、向上、向下移动)。此时,程序还应该维护另一个char数组,该数组记录找到的路径(如果有的话)并在处理结束时打印出
本文向大家介绍Java实现走迷宫回溯算法,包括了Java实现走迷宫回溯算法的使用技巧和注意事项,需要的朋友参考一下 以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 (1) 根据二维数组,输出迷宫的图形。 (2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到
最近,我一直在尝试编写一些递归迷宫代码,它可以返回迷宫中的最短路径。如果迷宫中没有路径,那么代码将返回-1。 例如,对于董事会: 其中S是迷宫的起点,W代表一堵墙,X代表所需的目的地,和-代表一个可用的路径点。输出将是: 对于董事会: 输出将是 这一切都是通过一个board类实现的,该类接受一个字符串和迷宫的尺寸,一个返回最短路径的检查函数,以及一个返回最短路径的win函数,如果没有路径,则返回-
本文向大家介绍C++实现走迷宫小游戏,包括了C++实现走迷宫小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现走迷宫小游戏的具体代码,供大家参考,具体内容如下 源码下载:C++实现走迷宫小游戏 主程序代码: 更多C++精彩小游戏请点击专题:经典游戏 进行学习 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。