java使用链栈实现迷宫求解
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html
java实现链栈的代码:
package stackapplication; public class LinkStack { private Element base;
private Element top; class Element
{
public Step data;
public Element next;
} /**
* 初始化栈
* */
public void initStack()
{
top = new Element();
base = new Element();
top.data=null;
top.next=base;
base.data=null;
base.next=null;
} /**
* 入栈
* */
public void push(Step o)
{
Element e = new Element();
e.data = o;
if(top.next==base)//第一次入栈操作
{
e.next=base;
top.next=e;
}else
{
e.next=top.next;
top.next=e;
} } /**
* 出栈
* */
public Step pop()
{
Step o = null;
if(top.next==base)
{
System.out.println("栈中没有元素!");
return o;
}else
{
o = top.next.data;
//System.out.println("出栈操作"+o);
top.next=top.next.next;
}
return o;
}
/**
* 判断栈是否为空
* */
public Boolean isEmpty()
{
if(top.next==base)
{
return true;
}
return false;
}
/**
* 打印栈
* */
public void print()
{
System.out.print("打印栈:");
Element temp =top;
while(temp.next!=base)
{
System.out.print(temp.next.data+"\t");
temp =temp.next;
}
System.out.println();
}
}
java实现迷宫求解的类代码:
package stackapplication; public class Maze { public static void main(String[] args) { int [][]map={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};//入口在map[1][1],出口在map[8][8] int [][]move={{0,-1},{0,1},{-1,0},{1,0}};//上下左右四个移动方向
LinkStack s = new LinkStack();
s.initStack();
LinkStack s1 = new LinkStack();
s1.initStack();
path(map,move,s,s1); while(!s1.isEmpty())
{
Step step = s1.pop();
System.out.println("("+step.x+","+step.y+")");
}
} private static int path(int[][] map, int[][] move,LinkStack s,LinkStack s1) {
Step step = new Step(1, 1, -1);//起始位置
//map[1][1]=-1;//表示已走过该点
s.push(step);
s1.push(step);
while(!s.isEmpty())
{
step=s.pop();
int x=step.x;
int y=step.y;
int d=step.d+1;
while(d<4)
{ int i=x+move[d][0];
int j=y+move[d][1];
if(map[i][j]==0 && i>=0 && i<10 && j>=0 &&j<10)//该位置是通的,且不越界
{
System.out.println(i+","+j);
step = new Step(x, y, d);
s.push(step);//将当前位置压入栈顶
s1.push(step); step = new Step(i, j, d);
s.push(step);//将当前位置压入栈顶
s1.push(step);
x=i;
y=j;
map[x][y]=-1;//表示已走过该点 if(x==8 && y==8)//到达出口
{
System.out.println("到达出口");
return 1;
}else
{
d=0;//到达一个新的点,所以要从新初始化方向,遍历其4个方向是否是通的
}
}else
{
d++;//下一个方向
}
}
}
return 0;
}
} class Step
{
int x;//横坐标
int y;//纵坐标
int d;//移动方向,取值为0,1,2,3。分别表示上下左右4个方向。 public Step(int x,int y,int d)
{
this.x=x;
this.y=y;
this.d=d;
}
}
java使用链栈实现迷宫求解的更多相关文章
- java使用链栈实现数制转换
java实现链栈在前面有所介绍:http://www.cnblogs.com/lixiaolun/p/4644141.html 将前面java实现链栈的代码稍作修改: package linkedst ...
- java与数据结构(6)---java实现链栈
栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...
- 数据结构——Java实现链栈
一.分析 栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表. 链栈是指采用链式存储结构实现的 ...
- java实现链栈
package linkstack; /** * Created by Administrator on 2019/4/18. */ public class LinkStack { private ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- 顺序栈,链栈,队列java实现
顺序栈 /** * 顺序栈 * */ public class SqStack { //栈的大小 private int maxSize; //栈顶指针 private int top; privat ...
- 个人项目Individual Project:迷宫求解
源码的github链接: https://github.com/zhangxue520/test 1.1问题描述: a.问题描述:以一个m * n的长方阵表示迷宫,0和1分别表示迷 ...
- Java实现链式存储的二叉树
二叉树的定义: 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 二叉树的遍历方式主要 ...
- 数据结构实验3:C++实现顺序栈类与链栈类
实验3 3.1 实验目的 熟练掌握栈的顺序存储结构和链式存储结构. 熟练掌握栈的有关算法设计,并在顺序栈和链栈上实现. 根据具体给定的需求,合理设计并实现相关结构和算法.3.2实验要求3.2.1 ...
随机推荐
- 【lct】bzoj1036 [ZJOI2008]树的统计Count
题意:给你一棵树,点带权,支持三种操作:单点修改:询问链上和:询问链上max. 这里的Query操作用了与上一题不太一样的做法(上一题用那种做法,因为在边带权的情况下换根太困难啦): 先ChangeR ...
- 【Kruskal+贪心思想】BZOJ3624-[Apio2008]免费道路
国庆万岁!!!!! [题目大意] 给定一张无向图,有两种边的类型为0和1.求一个最小生成树使得边0有k条. [思路] 跑两次Kruskal. 第一次的时候优先选择边1,然后判断有哪些边0还不能连通,那 ...
- Rails -- 自动清除日志
在开发模式中,开发环境日志会越来越大,所以需要设置自动清理,省内存. 在 config/initializers中新建一个文件 clear_blog.rb 编写如下代码 if Rails.env.de ...
- 也谈时间管理和GTD
也谈时间管理和GTD 时间管理 随着事情越来约多发现时间越来越不够用了,但是其实每天时间都是恒定的,并不增也不减,所以感觉时间不够用了总归只是个人主观感觉. 对我个人帮助比较大的是三本书<番茄时 ...
- JS 中对变量类型的判断
总结:1. 一般简单的使用 typeof 或 instanceof 检测(这两种检测的不完全准确) 2. 完全准确的使用 原生js中的 Object.prototype.toStri ...
- VS2010安装HTML5插件
步骤: 1. 下载 插件 2.拷贝文件里面德尔html_5.xsd到 D:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packa ...
- hdu 2147 kiki's game, 入门基础博弈
博弈的一些概念: 必败点(P点) : 前一个选手(Previous player)将取胜的位置称为必败点. 必胜点(N点) : 下一个选手(Next player)将取胜的位置称为必胜点. 必败(必胜 ...
- 【JSP EL】EL表达式里日期按照格式显示
转:http://blog.csdn.net/kaishuaige/article/details/8505174 JSP页面用EL表达式 输出date格式 1.头上引入标签 <%@ t ...
- 为什么要用<!DOCTYPE>声明
实例: 我们常常会看到类似这种代码: <!DOCTYPE html> <html> <head> <title>文档的标题</title> ...
- 《C++反汇编与逆向分析技术揭秘》之十——析构函数
局部对象 当对象所在作用域结束之后,销毁栈空间,此时析构函数被调用. 举例: 函数返回时自动调用析构函数: 堆对象 调用析构代理函数来处理析构函数: 为什么使用析构代理函数来调用析构函数?考虑到如果d ...