java寻找迷宫路径
来源:互联网 发布:php中面向对象的机制有 编辑:程序博客网 时间:2024/05/21 07:57
问题描述:
/*
* 用非递归的栈来解决
* 用类来解决迷宫路径的查找问题,寻找一条从左上角迷宫入口
* 到右下角迷宫出口的一条有效路径,0代表可以行走,1代表不能行走,
* 找到,请输入最终的迷宫和路径信息, 找不到,请输出不存在有效路径。
*
* 软件的运行如下:
*
* 请输入迷宫的行列数(m * n):5 5
* 请输入迷宫的路径:
* 0 0 1 0 0
* 1 0 0 1 0
* 0 1 0 1 0
* 0 0 0 1 0
* 0 0 0 0 0
*
* 正在寻找迷宫路径。。。
*
* 从左上角入口到右下角出口不存在有效路径 、、、、
* 路径已找到,输入如下(2代表行走的路径):
* 2 2 1 0 0
* 1 2 2 1 0
* 0 1 2 1 0
* 0 0 2 1 0
* 0 0 2 2 2
*
*
* */
package com.src.maze;//抽象迷宫路径的每一个节点的类型public class MazeNode { private int value; private int i; private int j; private int[] pathState; public MazeNode(int value, int i, int j){ this.value = value; this.i = i; this.j = j; //初始化节点的四个方向的路径信息,都初始化成不能行走 pathState = new int[Constant.WAY_NUMBER]; for(int k=0; k<pathState.length; ++k){ pathState[k] = Constant.WAY_DISABLE; } } //设置给节点的path方向状态为state public void setPathState(int path,int state){ pathState[path] = state; } public int getPathState(int path){ return pathState[path]; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public int getRow() { return i; } public void setRow(int i) { this.i = i; } public int getCol() { return j; } public void setCol(int j) { this.j = j; }}
package com.src.maze;//主要定义这个项目中所用到的所有的常量public class Constant { //表示方向的总数 public static final int WAY_NUMBER = 4; //表示路径可以行走 public static final int WAY_ENABLE = 1; //表示路径不可以行走 public static final int WAY_DISABLE = 0; //表示迷宫节点四个方向 public static final int WAY_EAST = 0; public static final int WAY_SOUTH = 1; public static final int WAY_WEST = 2; public static final int WAY_NORTH = 3;}
package com.src.maze;import java.util.Arrays;import java.util.Scanner;class SqStack{ private MazeNode[] stack; private int top; public SqStack(){ top = 0; stack = new MazeNode[50]; } //push要支持stack的内存增长操作,一次性增长2倍 public void push(MazeNode node){ if(full()){ this.resize(); } this.stack[top++] = node; } public void pop(){ if(empty()) return ; this.top--; } public MazeNode top(){ return this.stack[this.top-1]; } public boolean full(){ return this.top==this.stack.length; } public boolean empty(){ return this.top == 0; } private void resize(){ this.stack = Arrays.copyOf(this.stack, this.stack.length*2); }}//迷宫类class Maze{ private int row; private int colum; private MazeNode[][] mazePath; private SqStack stack; public Maze(int row, int colum){ this.row = row; this.colum = colum; mazePath = new MazeNode[this.row][this.colum]; stack = new SqStack(); } public void setPath(int i, int j, int value){ mazePath[i][j] = new MazeNode(value, i, j); } //该函数主要用来更改迷宫节点四个方向的行走状态 public void adjustMazePath(){ for(int i=0;i<row;++i){ for(int j=0;j<colum;++j){ if(mazePath[i][j].getValue() == 0){ //东 if(j<colum-1 && mazePath[i][j+1].getValue() == 0 ){ mazePath[i][j].setPathState(Constant.WAY_EAST, Constant.WAY_ENABLE); } //南 if(i<row-1 && mazePath[i+1][j].getValue() == 0 ){ mazePath[i][j].setPathState(Constant.WAY_SOUTH , Constant.WAY_ENABLE); } //西 if(j>0 && mazePath[i][j-1].getValue() == 0 ){ mazePath[i][j].setPathState(Constant.WAY_WEST, Constant.WAY_ENABLE); } //北 if(i>0 && mazePath[i-1][j].getValue() == 0 ){ mazePath[i][j].setPathState(Constant.WAY_NORTH, Constant.WAY_ENABLE); } } } } } //开始寻找迷宫路径 public void findMazePath(){ int i = 0; int j = 0; stack.push(mazePath[i][j]); while(!stack.empty() ){ //获得栈顶元素的行列号。 i = stack.top().getRow(); j = stack.top().getCol(); if(i == row-1 && j == colum-1){ break; } //东,判断当前节点东边可以走,将当前节点的东边改为不可走,将东边节点的西边改为不可走,再将东边节点入栈,再进行下一次的循环判断 if(mazePath[i][j].getPathState(Constant.WAY_EAST) == Constant.WAY_ENABLE ){ mazePath[i][j].setPathState(Constant.WAY_EAST ,Constant.WAY_DISABLE); mazePath[i][j+1].setPathState(Constant.WAY_WEST ,Constant.WAY_DISABLE); stack.push(mazePath[i][j+1]); continue; } //西 if(mazePath[i][j].getPathState(Constant.WAY_WEST) == Constant.WAY_ENABLE){ mazePath[i][j].setPathState(Constant.WAY_WEST ,Constant.WAY_DISABLE); mazePath[i][j-1].setPathState(Constant.WAY_EAST ,Constant.WAY_DISABLE); stack.push(mazePath[i][j-1]); continue; } //南 if(mazePath[i][j].getPathState(Constant.WAY_SOUTH) == Constant.WAY_ENABLE){ mazePath[i][j].setPathState(Constant.WAY_SOUTH ,Constant.WAY_DISABLE); mazePath[i+1][j].setPathState(Constant.WAY_NORTH ,Constant.WAY_DISABLE); stack.push(mazePath[i+1][j]); continue; } //北 if(mazePath[i][j].getPathState(Constant.WAY_NORTH) == Constant.WAY_ENABLE){ mazePath[i][j].setPathState(Constant.WAY_NORTH ,Constant.WAY_DISABLE); mazePath[i-1][j].setPathState(Constant.WAY_SOUTH ,Constant.WAY_DISABLE); stack.push(mazePath[i-1][j]); continue; } stack.pop(); } if(stack.empty()){ System.out.println("无合适路径"); }} //打印最终的迷宫路径信息 public void showMazePath(){ //将栈内元素改为2,即迷宫路径 while(!stack.empty()){ int i = stack.top().getRow(); int j = stack.top().getCol(); stack.pop(); this.setPath(i, j, 2 ); } for(int i=0; i<row; ++i){ for(int j=0; j<colum; ++j){ System.out.print(this.mazePath[i][j].getValue()+" "); } System.out.println(); } }}public class TestMazePathDemo { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scan = new Scanner(System.in); System.out.print("请输入迷宫的行列数(m * n):"); int row = scan.nextInt(); int col = scan.nextInt(); //maze现在代表的就是整个迷宫 Maze maze = new Maze(row, col); System.out.println("请输入迷宫的路径:"); for(int i=0; i<row; ++i){ for(int j=0; j<col; ++j){ int data = scan.nextInt(); maze.setPath(i, j, data); } } //以上代码,就把整个迷宫路径的信息都设置到maze对象里面了 //该函数主要用来更改迷宫节点四个方向的行走状态 maze.adjustMazePath(); //开始寻找迷宫路径 maze.findMazePath(); //打印最终的迷宫路径信息 maze.showMazePath(); }}
阅读全文
0 0
- java寻找迷宫路径
- 迷宫寻找路径
- Java利用回溯思想解决迷宫问题(寻找最短路径)
- 用栈寻找迷宫的最短路径
- 仙岛求药(迷宫寻找最短路径)DFS
- 3-java import寻找路径
- 迷宫的寻找路径和最短路径的动画演示
- 【java】走迷宫最短路径
- 寻找迷宫的出路
- 寻找迷宫出路
- 寻找迷宫出口<一>
- 广度优先寻找迷宫!
- java地图路径染色寻找算法
- 关于用深度优先算法生成迷宫与寻找路径的一些回忆
- A*算法--迷宫找最短路径(JAVA实现)
- 迷宫求解最短路径问题java版
- Java AOP实战 寻找SQL的引用路径
- java实现从迷宫寻找出路算法(广度优先搜索)
- jQuery的Chaining方法
- java常用正则表达式
- bzoj 4408 [Fjoi 2016]神秘数 主席树
- JS无缝滚动
- 用户注册(request,get和post中文乱码)
- java寻找迷宫路径
- 关闭”xx程序已停止工作”提示窗口
- MyEclipse配置
- android studio 最新3.0 kotlin与databinding 结合使用报错。
- H5 js中的localStorage与sessionStorage
- MySQL和Oracle差异
- unity编辑器扩展--AssetBundle菜单
- python matplotlib画图
- Oracle(ALL