关于java迷宫算法核心(非递归)
2017-11-03 22:42
363 查看
用非递归的栈来解决
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(i<this.row-1 && j<this.colum-1 && 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(j<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(){
System.out.println("chenkai");
int i=0,j=0;
stack.push(this.mazePath[i][j]);
MazeNode top;
while(!stack.empty()){
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
top = stack.top();
System.out.println(mazePath[4][2].getPath()[0]);
if(top.getRow() == this.row-1 && top.getCol() == this.colum-1)
break;
if(top.getRow() == this.row-1 && mazePath[top.getRow()][top.getCol()+1].getValue() == 0 ){
stack.push(mazePath[top.getRow()][top.getCol()+1]);
continue;
}
if(top.getCol() == this.colum-1 && mazePath[top.getRow()+1][top.getCol()].getValue() == 0){
stack.push(mazePath[top.getRow()+1][top.getCol()]);
continue;
}
//东
if(top.getCol()+1<this.colum && mazePath[top.getRow()][top.getCol()].getPath()[0] == Constant.WAY_ENABLE ){
mazePath[top.getRow()][top.getCol()+1].getPath()[2] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("dong");
stack.push(mazePath[top.getRow()][top.getCol()+1]);
continue;
}
//南
if(top.getRow()+1<this.row && mazePath[top.getRow()][top.getCol()].getPath()[1] == Constant.WAY_ENABLE ){
mazePath[top.getRow()+1][top.getCol()].getPath()[3] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("nan");
stack.push(mazePath[top.getRow()+1][top.getCol()]);
continue;
}
//西
if(top.getCol()-1>0 && mazePath[top.getRow()][top.getCol()].getPath()[2] == Constant.WAY_ENABLE ){
mazePath[top.getRow()][top.getCol()-1].getPath()[0] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("xi");
stack.push(mazePath[top.getRow()][top.getCol()-1]);
continue;
}
//北
if(top.getRow()-1>0 && mazePath[top.getRow()][top.getCol()].getPath()[3] == Constant.WAY_ENABLE ){
mazePath[top.getRow()][top.getCol()-1].getPath()[1] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("bei");
stack.push(mazePath[top.getRow()-1][top.getCol()]);
continue;
}
stack.pop();
}
}
//打印最终的迷宫路径信息
public void showMazePath(){
System.out.println(stack.empty());
while(!stack.empty()){
stack.top().setValue(2);
stack.pop();
}
for(int i=0;i<this.row;i++){
for(int j=0;j<this.colum;j++){
System.out.print(this.mazePath[i][j].getValue()+" ");
}
System.out.println();
}
}
执行结果
97b8
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(i<this.row-1 && j<this.colum-1 && 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(j<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(){
System.out.println("chenkai");
int i=0,j=0;
stack.push(this.mazePath[i][j]);
MazeNode top;
while(!stack.empty()){
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
top = stack.top();
System.out.println(mazePath[4][2].getPath()[0]);
if(top.getRow() == this.row-1 && top.getCol() == this.colum-1)
break;
if(top.getRow() == this.row-1 && mazePath[top.getRow()][top.getCol()+1].getValue() == 0 ){
stack.push(mazePath[top.getRow()][top.getCol()+1]);
continue;
}
if(top.getCol() == this.colum-1 && mazePath[top.getRow()+1][top.getCol()].getValue() == 0){
stack.push(mazePath[top.getRow()+1][top.getCol()]);
continue;
}
//东
if(top.getCol()+1<this.colum && mazePath[top.getRow()][top.getCol()].getPath()[0] == Constant.WAY_ENABLE ){
mazePath[top.getRow()][top.getCol()+1].getPath()[2] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("dong");
stack.push(mazePath[top.getRow()][top.getCol()+1]);
continue;
}
//南
if(top.getRow()+1<this.row && mazePath[top.getRow()][top.getCol()].getPath()[1] == Constant.WAY_ENABLE ){
mazePath[top.getRow()+1][top.getCol()].getPath()[3] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("nan");
stack.push(mazePath[top.getRow()+1][top.getCol()]);
continue;
}
//西
if(top.getCol()-1>0 && mazePath[top.getRow()][top.getCol()].getPath()[2] == Constant.WAY_ENABLE ){
mazePath[top.getRow()][top.getCol()-1].getPath()[0] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("xi");
stack.push(mazePath[top.getRow()][top.getCol()-1]);
continue;
}
//北
if(top.getRow()-1>0 && mazePath[top.getRow()][top.getCol()].getPath()[3] == Constant.WAY_ENABLE ){
mazePath[top.getRow()][top.getCol()-1].getPath()[1] = Constant.WAY_DISABLE;
System.out.println(top);
System.out.println("bei");
stack.push(mazePath[top.getRow()-1][top.getCol()]);
continue;
}
stack.pop();
}
}
//打印最终的迷宫路径信息
public void showMazePath(){
System.out.println(stack.empty());
while(!stack.empty()){
stack.top().setValue(2);
stack.pop();
}
for(int i=0;i<this.row;i++){
for(int j=0;j<this.colum;j++){
System.out.print(this.mazePath[i][j].getValue()+" ");
}
System.out.println();
}
}
执行结果
97b8
相关文章推荐
- [JsonSchema] 关于接口测试 Json 格式比对核心算法实现 (Java 版)
- 关于google map api中的球平投影算法接口: GProjection和GMercatorProjection类 - tim-wu - BlogJava
- 关于Java核心技术书中的代码点和代码单元是怎么理解的呢?
- 关于java递归调用内存泄漏
- 关于AES算法 JAVA同C++互解(AES)
- 设计及设计模式:关于Java权限控制算法
- java关于递归
- DES加密算法java实现(核心算法+源代码)
- Java 算法基础 -递归
- 严蔚敏《数据结构》中迷宫算法java实现
- 关于Java中的递归操作--(以将一个正整型十进制数转换为二进制数为例)
- 关于Java权限控制算法
- 关于java递归调用内存泄露
- 关于Java权限控制算法【转】
- 算法-java 递归中的Fibonacci数列
- 关于《射雕英雄传》的数学算法问题 JAVA实现
- 关于JAVA核心技术的泛型一章
- 迷宫问题的算法(优于递归、深度优先、广度优先)
- 关于递归的几个算法实现
- 关于java的数据结构和算法