java基础实践---非递归用栈实现查找迷宫路径

来源:互联网 发布:java招聘系统源代码 编辑:程序博客网 时间:2024/05/01 02:53

用非递归的栈来解决,用类来解决迷宫路径的查找问题,寻找一条从左上角迷宫入口,到右下角迷宫出口的一条有效路径,0代表可以行走,1代表不能行走,找到,请输入最终的迷宫和路径信息, 找不到,请输出不存在有效路径。

一:首先就是创建一个类:栈 包括基本的成员变量和方法:

class SqStack{private MazeNode[] stack;private int top;public SqStack(){top = 0;stack = new MazeNode[50];}public void push(MazeNode node){if(this.full()){this.stack = Arrays.copyOf(this.stack, this.stack.length*2);}this.stack[this.top] = node;top++;}public void pop(){if(!this.empty()){this.top--;}}public MazeNode top(){if(!this.empty())return this.stack[this.top-1];return null;}public boolean empty(){return this.top == 0;}public boolean full(){return this.top == stack.length;}}
二:然后就是迷宫类:其中包括调整每个节点的东南西北的可行走状态 以及查找这个迷宫的路径还有输出

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<this.row;++i){for(int j=0;j<this.colum;++j){if(this.mazePath[i][j].getValue()==0) //只需要调整0 的结点{if(j>0  && this.mazePath[i][j-1].getValue()!=1){this.mazePath[i][j].getPath()[Constant.WAY_WEST]=Constant.WAY_ENABLE;}if(j<this.row-1 && this.mazePath[i][j+1].getValue()!=1){this.mazePath[i][j].getPath()[Constant.WAY_EAST]=Constant.WAY_ENABLE;}if(i<this.colum-1 && this.mazePath[i+1][j].getValue()!=1){this.mazePath[i][j].getPath()[Constant.WAY_SOUTH]=Constant.WAY_ENABLE;}if(i>0 && this.mazePath[i-1][j].getValue()!=1){this.mazePath[i][j].getPath()[Constant.WAY_NORTH]=Constant.WAY_ENABLE;}}}}}//开始寻找迷宫路径public void findMazePath(){int i=0;int j=0;if(this.mazePath[0][0].getValue()==0){this.stack.push(this.mazePath[0][0]);while(!this.stack.empty()){i=this.stack.top().getRow();j=this.stack.top().getCol();if(i==this.row-1 && j==this.colum-1){break;}if(this.mazePath[i][j].getPath()[Constant.WAY_EAST]==Constant.WAY_ENABLE){this.mazePath[i][j].getPath()[Constant.WAY_EAST]=Constant.WAY_DISABLE;this.mazePath[i][j+1].getPath()[Constant.WAY_WEST]=Constant.WAY_DISABLE;this.stack.push(this.mazePath[i][j+1]);continue;}if(this.mazePath[i][j].getPath()[Constant.WAY_SOUTH]==Constant.WAY_ENABLE){this.mazePath[i][j].getPath()[Constant.WAY_SOUTH]=Constant.WAY_DISABLE;this.mazePath[i+1][j].getPath()[Constant.WAY_NORTH]=Constant.WAY_DISABLE;this.stack.push(this.mazePath[i+1][j]);continue;}if(this.mazePath[i][j].getPath()[Constant.WAY_WEST]==Constant.WAY_ENABLE){this.mazePath[i][j].getPath()[Constant.WAY_WEST]=Constant.WAY_DISABLE;this.stack.push(this.mazePath[i][j]);continue;}if(this.mazePath[i][j].getPath()[Constant.WAY_NORTH]==Constant.WAY_ENABLE){this.mazePath[i][j].getPath()[Constant.WAY_NORTH]=Constant.WAY_DISABLE;this.stack.push(this.mazePath[i][j]);continue;}this.stack.pop();if(this.stack.empty()){System.out.println("没有找到路径");}}}}//打印最终的迷宫路径信息public void showMazePath(){int m=0;int n=0;while(!this.stack.empty()){m=this.stack.top().getRow();n=this.stack.top().getCol();this.mazePath[m][n].setValue(2);this.stack.pop();}for(int i=0;i<this.row;++i){for(int j=0;j<this.colum;++j){System.out.printf("%d  ",this.mazePath[i][j].getValue());}System.out.println("");}}}

三:其中用到的其他的俩个类就是 :

1、迷宫其实就是一个二维数组 那每一个结点也是一个类 包含记录自己当前所在的行列值以及行走状态的数组

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;}}public int[] getPath(){return pathState;}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;}}
2、为了不混淆0 1 方便直观的判断含义 新建一个constant类

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;}




原创粉丝点击