问题:

/*

用非递归的栈来解决

用类来解决迷宫路径的查找问题,寻找一条从左上角迷宫入口

到右下角迷宫出口的一条有效路径,0代表可以行走,1代表不能行走,

找到,请输入最终的迷宫和路径信息, 找不到,请输出“不存在有效路径"。

*/

主函数:

package main;

import java.util.Scanner;

import maze.Maze;

public class MainTest {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in = new Scanner(System.in);

System.out.println("请输入迷宫大小:");

int size = in.nextInt();

Maze maze = new Maze(size);

System.out.println("请输入迷宫具体的路径信息:0表示路径可以走,1表示路径不能走:");

for(int i=0; i

for(int j=0; j

int data = in.nextInt();

maze.setMazeNode(i, j, data);

}

}

//开始寻找路径信息

maze.findPath();

//打印最终的路径信息

maze.showPath();

}

}

常量类:

package constant;

/**

* 描述: 定义项目所有的常量

*/

public interface Constant {

//路径的方向总数

int PATH_NUM = 4;

//右方向

int PATH_RIGHT = 0;

//下方向

int PATH_DOWN = 1;

//左方向

int PATH_LEFT = 2;

//上方向

int PATH_UP = 3;

//路径可以行走

int STATE_OK = 5;

//路径不能行走

int STATE_ERR = 6;

}

用来存放路径的类:

package maze;

import constant.Constant;

import node.MazeNode;

import stack.MazeStack;

public class Maze {

//存储迷宫路径信息

private MazeNode[][] mazePath;

//求解迷宫路径所需要的栈类型

private MazeStack stack;

//表示迷宫路径的大小

private int size;

/**

* 迷宫对象的初始化

* @param size

*/

public Maze(int size) {

// TODO Auto-generated constructor stub

this.size = size;

stack = new MazeStack();

mazePath = new MazeNode[this.size][this.size];

}

/**

* 给迷宫路径生成相应的节点

* @param i

* @param j

* @param data

*/

public void setMazeNode(int i, int j, int data) {

// TODO Auto-generated method stub

mazePath[i][j] = new MazeNode(i, j, data);

}

/**

* 开始寻找迷宫路径信息

*/

public void findPath() {

// TODO Auto-generated method stub

if(mazePath[0][0].getVal()!=0) {

System.out.println("there is no way!");

return;

}

fixPathState();

//开始寻找迷宫路径

int i=0;

int j=0;

stack.push(mazePath[i][j]);

while(!stack.empty()) {

i=stack.top().getX();

j=stack.top().getY();

if(i == this.size - 1 && j ==this. size - 1) {

break;

}

//向右

if(mazePath[i][j].getPath()[Constant.PATH_RIGHT] == Constant.STATE_OK) {

//将该节点 行走 状态设置为不行

mazePath[i][j].setPathState(Constant.PATH_RIGHT, Constant.STATE_ERR);

//将该节点 左边行走 状态设置为不行

mazePath[i][j+1].setPathState(Constant.PATH_LEFT, Constant.STATE_ERR);

将该节点右边节点入栈

stack.push(mazePath[i][j+1]);

continue;

}

//向下

if(mazePath[i][j].getPath()[Constant.PATH_DOWN] == Constant.STATE_OK) {

//将该节点 行走 状态设置为不行

mazePath[i][j].setPathState(Constant.PATH_DOWN, Constant.STATE_ERR);

//将该节点 上边行走状态设置为不行

mazePath[i+1][j].setPathState(Constant.PATH_UP, Constant.STATE_ERR);

//将该节点下边节点入栈

stack.push(mazePath[i+1][j]);

continue;

}

//向左

if(mazePath[i][j].getPath()[Constant.PATH_LEFT] == Constant.STATE_OK) {

//将该节点 行走 状态设置为不行

mazePath[i][j].setPathState(Constant.PATH_LEFT, Constant.STATE_ERR);

//将该节点 右边行走 状态设置为不行

mazePath[i][j-1].setPathState(Constant.PATH_RIGHT, Constant.STATE_ERR);

//将该节点左边节点入栈

stack.push(mazePath[i][j-1]);

continue;

}

//向上

if(mazePath[i][j].getPath()[Constant.PATH_UP] == Constant.STATE_OK) {

//将该节点 行走 状态设置为不行

mazePath[i][j].setPathState(Constant.PATH_UP, Constant.STATE_ERR);

//将该节点 下边行走 状态设置为不行

mazePath[i-1][j].setPathState(Constant.PATH_DOWN, Constant.STATE_ERR);

//将该节点上边节点入栈

stack.push(mazePath[i-1][j]);

continue;

}

stack.pop();

}

if(stack.empty()) {

System.out.println("no way");

}

}

/**

* 调整迷宫路径所有节点的行走状态

*/

private void fixPathState() {

// TODO Auto-generated method stub

for(int i=0; i

for(int j=0; j

// i, j

//向右

if(j

mazePath[i][j].setPathState(Constant.PATH_RIGHT, Constant.STATE_OK);

}

//向下

if(i

mazePath[i][j].setPathState(Constant.PATH_DOWN, Constant.STATE_OK);

}

//向左

if(j>0 && mazePath[i][j-1].getVal() == 0) {

mazePath[i][j].setPathState(Constant.PATH_LEFT, Constant.STATE_OK);

}

//向上

if(i>0 && mazePath[i-1][j].getVal() == 0) {

mazePath[i][j].setPathState(Constant.PATH_UP, Constant.STATE_OK);

}

}

}

}

/**

* 打印迷宫路径信息

*/

public void showPath() {

// TODO Auto-generated method stub

while(!stack.empty()) {

int i=stack.top().getX();

int j=stack.top().getY();

this.setMazeNode(i, j, 7);

stack.pop();

}

System.out.println("迷宫路径信息(路径可以走 7表示):");

for(int i=0 ; i

for(int j=0;j

System.out.print(this.mazePath[i][j].getVal()+" ");

}

System.out.println();

}

}

}

迷宫路径节点的类型信息类:

package node;

import constant.Constant;

public class MazeNode {

//存储节点的值

private int val;

//存储节点的坐标

private int x;

private int y;

//存储节点四个方向的行走状态

private int[] path;

/**

* 节点对象的初始化

* @param i

* @param j

* @param data

*/

public MazeNode(int i, int j, int data) {

// TODO Auto-generated constructor stub

this.x = i;

this.y = j;

this.val = data;

//初始化节点的四个方向行走信息的时候,都初始化成不能走

path = new int[Constant.PATH_NUM];

for(int k=0; k

path[k] = Constant.STATE_ERR;

}

}

public int getVal() {

return val;

}

public void setVal(int val) {

this.val = val;

}

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

public int getY() {

return y;

}

public void setY(int y) {

this.y = y;

}

public int[] getPath() {

return path;

}

public void setPath(int[] path) {

this.path = path;

}

/**

* 把节点相应的方向path,的行走状态,修改为state

* @param pathRight

* @param stateOk

*/

public void setPathState(int pathid, int state) {

// TODO Auto-generated method stub

this.path[pathid] = state;

}

}

迷宫需要的顺序栈结构 (内存可增长):

package stack;

import java.util.Arrays;

import node.MazeNode;

public class MazeStack {

private MazeNode[] stack;

private int top;

public MazeStack(){

this.stack = new MazeNode[10];

this.top = 0;

}

/**

* 入栈

* @param val

*/

public void push(MazeNode mazeNode) {

if(full()) {

this.stack=Arrays.copyOf(this.stack, 2*this.top);

}

this.stack[this.top]=mazeNode;

this.top++;

}

/**

* 出栈

*/

public void pop() {

if(empty()) {

return;

}

this.top--;

}

/**

* 返回栈顶元素

* @return

*/

public MazeNode top() {

return this.stack[this.top-1];

}

/**

* 判断栈空

* @return

*/

public boolean empty() {

return this.top == 0;

}

/**

* 判断栈满

* @return

*/

public boolean full() {

return this.top == this.stack.length;

}

}

运行结果:

请输入迷宫大小:

5

请输入迷宫具体的路径信息:0表示路径可以走,1表示路径不能走:

0 0 0 0 1

1 0 1 0 1

0 0 1 1 1

0 1 0 0 1

0 0 0 0 0

迷宫路径信息(路径可以走 7表示):

7 7 0 0 1

1 7 1 0 1

7 7 1 1 1

7 1 0 0 1

7 7 7 7 7

java怎样找出迷宫中所有路径_Java寻找迷宫路径相关推荐

  1. java数组找出重复元素及次数_Java查找数组重复元素,并打印重复元素、重复次数、重复元素位置...

    面试题查找重复元素并打印重复次数和重复位置,一顿懵逼,回来死磕写下来,打印指定重复次数和最大次数,其他在此基础上可以再更新 package sort; import org.testng.annota ...

  2. Java实现找出数组中重复次数最多的元素以及个数

    /**数组中元素重复最多的数* @param array* @author shaobn* @param array*/public static void getMethod_4(int[] arr ...

  3. java 找出list中相同数据_Java获取List中相同的数据

    我现在连废话都懒得说了,直接讲代码吧! int index = 0; for (int i = 0,len = list.size(); i < len; i++) { if(list.size ...

  4. java数组出现次数最多的数_找出数组中出现次数最多的那个数——主元素问题...

    方法一:以空间换时间,可以定义一个计数数组int count[101],用来对数组中数字出现的次数进行计数(只能针对数组中数字的范围1~100),count数组中最大的元素对应的下标,即为出现次数最多 ...

  5. 二叉树路径和最大python_python3实现在二叉树中找出和为某一值的所有路径(推荐)...

    请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径. 规则如下: 1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条 ...

  6. java如何找重复数字_Java如何找出数组中重复的数字

    题目描述:找出数组中重复的数字,具体内容如下 在一个长度为n的数组里的所有数字都在 0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复了几次.请找出数组中任意 ...

  7. java 数组不重复_java如何找出数组中的不重复数字

    找出数组中不重复的一个数字,题目大致是这样的:int[] a = { 1, 2, 3, 4, 3, 2, 1 }; 在线视频教程推荐:java在线学习 解决办法是:public static int ...

  8. java 算法之找出数组中第二大的数

    1.如果仅考虑实现功能而不考虑效率,可以先通过排序算法将数组排序,然后根据数组下标来访问数组中第二大的数,,最快的排序算法一般为快速排序算法,但是其时间复杂度为(nlogn),根据下标访问需要便利一遍 ...

  9. Java找出数组中第K大的数

    题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...

最新文章

  1. Android菜单详解(一)——理解android中的Menu
  2. vm虚拟机和windows共享文件夹
  3. c语言三目运算错误,c语言中三目运算符有什么用
  4. P2495-[SDOI2011]消耗战【虚树,dp】
  5. java删除集合元素吗_java如何删除集合中的元素
  6. 第I题-生理周期(简单解法跳着试)====人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,
  7. 《剑指offer》第二章小结(1)——链表的基本操作
  8. matlab设置等高线标注字体大小,matlab设置图中字体和线条大小等(转)
  9. 局域网中的几大分类,包含以太网,FDDI网,令牌环网,ATM网
  10. c语言为什么要使用short类型,为什么c语言中short的表示范围是-32768~32767?(转)...
  11. 芯片,建立在沙粒上的帝国!
  12. 脚本(script)——通俗易懂去理解
  13. 《德鲁克管理思想精要》读书笔记8 - 时间
  14. Cesium 两点之间的直线距离
  15. oracle 月底,Oracle查询月初和月底时间
  16. P4924 [1007]魔法少女小Scarlet
  17. 《无人机网络与通信》整理
  18. 【算法无用系列】AC自动机敏感词过滤
  19. Alamofire学习(一)网络基础
  20. 搜索总结)(深搜和广搜)

热门文章

  1. 原生js小游戏——俄罗斯方块
  2. 线性代数考研笔记(一)
  3. FPGA交通灯 Verilog Modelsim
  4. linux系统用户和普通用户,适合普通Linux用户的五大Linux发行版
  5. 基于STM32和hs1527、ev1527、rt1527、fp1527的无线接收解码程序
  6. 【观点】“马云:金融是要为外行人服务,这个观点其实并不新鲜
  7. Oracle导入dmp文件闪退处理方案
  8. 姐姐半夜不睡觉,既然偷偷在被窝里偷看HTML基础⭐
  9. UE5导入MetaHuman
  10. centos :不在 sudoers 文件中。此事将被报告