`
爱在爪哇
  • 浏览: 7845 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

迷宫算法问题

阅读更多
package cn.gao.algorithm.bean;
/*封装迷宫的基类,成员x,y分别代表第一维,第二维坐标。(当然这里可以做的灵活一点,就是设计可扩展的维数)*/
public class IndexBean {
     private int x;
     private int y;
	public IndexBean(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	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;
	}
	@Override
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		result = PRIME * result + x;
		result = PRIME * result + y;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final IndexBean other = (IndexBean) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "IndexBean:x="+x+" y="+y;
	}
	

    
}



package cn.gao.algorithm.model;
import cn.gao.algorithm.bean.IndexBean;

/*设计一个栈,具有基本的先进后出的栈特性*/
public class StackForTest<T> implements Cloneable{

	/**
	 * @param args
	 */
	
	private Object a[];/*栈对应的原生数组*/
	private int index;/*栈的当前索引*/
	private int max;/*栈容量*/
	
	public StackForTest(int max) {/*构造函数初始化*/
		super();
		this.max = max;
		a=new Object[max];
		index=-1;
	}
	public boolean isFull()/*判断栈是否满*/
	{
		if(index>=max-1)
		{
			return true;
		}
		return false;
	}
	public boolean isNull()/*判断栈是否空*/
	{
		if(index<=-1)
		{
			return true;
		}
		return false;
	}
	@SuppressWarnings("unchecked")
	public T get()/*出栈---获取栈中元素*/
	{
		if(!isNull())
		{
			return (T)a[index--];
		}
		return null;
	}
	public void add(T tb)/*入栈--插入栈中元素*/
	{
		if(!isFull())
		{
			a[++index]=tb;	
		}
	}
	public void remove()/*/*出栈---移除栈中元素*/
	{
		if(!isNull())
		{
			index--;
		}
	}
	public void printAll()/*自底向上遍历栈中所有元素*/
	{
	   for(int i=0;i<=index;i++)
	   {
		   System.out.println(a[i]);
	   }
	}
	public void clear()/*清空栈*/
	{
		for(int i=0;i<max;i++)
		{
			a[i]=null;
		}
		index=-1;
	}
	public int getLength()/*获取栈长度(元素个数)*/
	{
	   	return index+1;
	}
    
	@SuppressWarnings("unchecked")
	@Override
	public Object clone() throws CloneNotSupportedException {
		// TODO Auto-generated method stub
		StackForTest stackClone=new StackForTest(this.max);
		for(int i=0;i<=this.index;i++)
		{
			stackClone.add(this.a[i]);
		}
		return stackClone;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StackForTest<IndexBean> stack =new StackForTest<IndexBean>(3);
		stack.add(new IndexBean(1,2));
		stack.add(new IndexBean(2,3));
		stack.add(new IndexBean(3,4));
		System.out.println(stack.get());
		System.out.println(stack.get());
		System.out.println(stack.get());
		stack.printAll();
		System.out.println();
		stack.clear();
		stack.printAll();
	

	}

}



package cn.gao.algorithm2.service;
import cn.gao.algorithm.bean.IndexBean;
import cn.gao.algorithm.model.StackForTest;
/**
 * @param args
 * 迷宫问题:给定迷宫数组(0表示通路,1表示墙壁),从入口(startX,startY)开始,寻找到出口(endX,endY)的路径。
 * 打印所有的路径组合,并求出最短路径
 */
public class Test10 {
	public int a[][];/*迷宫数组 0表示通路,1表示墙壁*/
	public int m,n;/*迷宫数组的第一维,第二维*/
	public int flag[][];/*访问标志,0表示未访问,1表示访问过*/
	public StackForTest stack;/*逻辑栈*/
    public int startX,startY,endX,endY;/*迷宫入口和出口*/
    public StackForTest bestStack;/*保存最短路径栈*/
    public int stackLength;/*保存每次成功路径的栈长度,便于计算最短的*/
    public int count;/*统计路径个数*/
	public Test10(int[][] a) {
		super();
		this.a = a;
		m=a.length;
		n=a[0].length;
		flag=new int[m][n];
		for(int i=0;i<m;i++)/*初始化状态数组*/
		{
			for(int j=0;j<n;j++)
			{
				flag[i][j]=0;
			}
		}
		stack=new StackForTest(m*n);/*初始化栈,程序中的路径栈不可能超过迷宫数组的元素个数*/
		stackLength=0;
		count=0;
	}

	public void setEndX(int endX) {
		this.endX = endX;
	}

	public void setEndY(int endY) {
		this.endY = endY;
	}

	public void setStartX(int startX) {
		this.startX = startX;
	}
	public void setStartY(int startY) {
		this.startY = startY;
	}

	@SuppressWarnings("unchecked")
	public void findPath(int x,int y)/*从任意点(x,y)寻找最终路径endX,endY*/
    {
    	if(x<0||x>m-1||y<0||y>n-1||flag[x][y]==1)
    	{
    		return ;
    	}
    	if(x==endX&&y==endY)
    	{ 		
     		count++;
    		System.out.println("第"+count+"次路径");
    		stack.add(new IndexBean(x,y)); 
    		stack.printAll();
    		System.out.println("\n\n");
    		if(count==1)
    		{
    			stackLength=stack.getLength();
    		}
    		if(stackLength>=stack.getLength())/*判断当前获得的路径栈长度是否小于历史最小路径栈长度*/
    		{
    			stackLength=stack.getLength();
    			try {
					bestStack=(StackForTest)stack.clone();
				} catch (CloneNotSupportedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
    		}
    		stack.remove();
    		return ;
    	}
    	if(flag[x][y]==0)/*对于未访问的‘墙’,都将其访问标志直接只已访问,且返回false*/
    	{
    		if(a[x][y]==1)
    		{
    			flag[x][y]=1;
    			return ;
    		}
    		
    	}
    	/*下面主要对未访问过的且坐标为‘通道’的路径点进行递归处理*/
    	stack.add(new IndexBean(x,y)); /*入栈当前数据*/
    	flag[x][y]=1;/*置当前访问标志*/
    	findPath(x,y-1);/*左*/
    	findPath(x,y+1);/*右*/
    	findPath(x-1,y);/*上*/
    	findPath(x+1,y);/*下*/
    	stack.remove();/*对于该元素上下左右都走不通,此元素出栈*/
    }
	public void find()
	{
		findPath(startX,startY);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a[][]={
				{1,1,1,1,1,1,1,1,1},
				{1,0,0,0,1,0,0,0,1},
				{1,0,1,0,0,0,1,0,1},
				{1,0,0,1,1,1,1,0,1},
				{1,1,0,0,1,0,1,0,1},
				{1,1,1,0,0,0,0,0,1},
				{1,1,1,1,1,1,1,1,1},
				
		};
		Test10 t=new Test10(a);
		t.setStartX(1);
		t.setStartY(1);
		t.setEndX(5);
		t.setEndY(7);
		t.find();
		System.out.println("总共有"+t.count+"种路径法,最短路径如下:");
		t.bestStack.printAll();
         
	}

}

 

分享到:
评论

相关推荐

    迷宫算法(Java)

    在IT领域,迷宫算法是一种常见的问题解决方法,它涉及到路径寻找、图遍历和决策树等概念。本文将深入探讨使用Java实现迷宫算法,特别是结合搜索回溯策略,并带有方向倾向性。 首先,我们要理解迷宫问题的基本框架。...

    优化的迷宫算法

    迷宫算法是计算机科学中的一种经典问题,它涉及路径搜索、图论和算法设计等多个领域。在这个特定的优化版本中,我们关注的是如何有效地找到迷宫中的最短路径。在实际应用中,这种算法不仅在游戏设计、地图导航等领域...

    Java迷宫算法 Java迷宫算法

    Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法;Java迷宫算法

    迷宫算法来自动生成迷宫

    迷宫算法是一种在计算机科学中常见的问题,主要应用于游戏开发、路径规划等领域。自动生成迷宫的算法有很多种,包括深度优先搜索(DFS)、广度优先搜索(BFS)、Prim算法、Kruskal算法以及瓦片法等。这些算法各有...

    数据结构 迷宫算法

    迷宫算法是数据结构应用的一个有趣实例,通常用于解决路径寻找问题。在这个实验中,我们将利用栈这一数据结构来解决迷宫问题。 栈是一种线性数据结构,遵循“后进先出”(LIFO)原则,类似于日常生活中的堆叠物品。...

    迷宫算法c语言经典代码

    迷宫算法c语言代码。迷宫算法c语言经典代码迷宫算法c语言经典代码

    迷宫算法迷宫算法

    迷宫算法是计算机科学中的一种路径寻找问题,它在游戏设计、图形学、人工智能和算法竞赛等领域有着广泛的应用。在解决迷宫问题时,我们通常需要设计或选择一种算法来帮助“虚拟角色”或者程序从起点找到终点。下面将...

    破解迷宫算法(需要预先下载随即迷宫生成算法)

    下载该资源前请确认已下载前置资源(随机迷宫生成算法),使用时先使用随即迷宫生成算法生成迷宫.txt文件,再将该文件复制到破解迷宫算法C文件同目录下才可使用。请确保头文件中的raw值和column值与随机迷宫生成算法...

    智能图形化迷宫算法

    智能图形化迷宫算法是一种将计算机科学中的算法与图形用户界面相结合的技术,旨在解决迷宫求解问题。在这个程序中,用户可以自定义绘制迷宫图形,程序随后会通过特定的算法找出从起点到终点的最短路径。下面将详细...

    c语言实现的迷宫算法

    在编程领域,迷宫算法是一种常见且有趣的问题解决方法,主要应用于路径搜索、游戏设计以及图形处理等场景。本文将详细解析用C语言实现的迷宫算法,通过深入理解其核心思想,帮助读者掌握此类算法的基本原理和实现...

    AStar算法求解迷宫问题

    在迷宫问题中,AStar算法被广泛应用,能够高效地解决从起点到终点的寻路问题。 AStar算法的核心思想可以分为以下几个步骤: 1. **定义图**:将迷宫视为一个图,其中每个节点代表一个位置,边则表示相邻的可通行...

    只能老鼠走迷宫算法

    ### 智能老鼠走迷宫算法解析 #### 一、引言 随着人工智能与机器人技术的快速发展,智能机器人的应用场景越来越广泛。其中,“智能老鼠”作为一种能够在复杂环境中自主导航的机器人,尤其受到关注。这类机器人通常...

    C语言数据结构 迷宫算法

    6. **迷宫问题的实现**:在C语言中实现迷宫算法通常涉及以下几个步骤: - 初始化迷宫数据结构,可以使用二维数组表示。 - 定义一个栈结构,并实现入栈(push)和出栈(pop)操作。 - 设定起点和终点,开始搜索...

    C#实现4种经典迷宫生成算法和迷宫寻路算法

    在IT领域,迷宫生成和寻路算法是游戏开发、路径规划、图形处理等领域中常见的问题。本项目涉及的是使用C#语言实现的4种经典迷宫生成算法和A*寻路算法。以下是对这些算法的详细解释: 1. **并查集算法生成迷宫**: ...

    迷宫算法 迷宫的详细步骤及算法

    迷宫的详细步骤及算法 /*迷宫的行数*/ /*迷宫的列数*/ /*初始化栈*/

    数据结构迷宫算法

    学习数据结构时候编写的迷宫算法, 欢迎批评指正相互学习!

    迷宫问题A*算法

    本科生计算机相关专业 人工智能课程 A*算法解决迷宫问题C++代码 详细注释,易懂

    【stl】 迷宫算法

    ### STL简易迷宫算法解析 本文将详细介绍一个基于STL(标准模板库)实现的简易迷宫算法。此算法不仅涵盖了迷宫的生成过程,还包括了寻找从入口到出口路径的基本逻辑。 #### 标题解释:“【stl】迷宫算法” 标题中...

    c语言迷宫算法

    《C语言迷宫算法》是数据结构领域的一个经典问题,主要涉及到栈这一数据结构的应用。在计算机科学中,迷宫问题通常被用来演示路径搜索算法,而栈由于其后进先出(LIFO)的特性,非常适合用于解决这类问题。 栈是一...

    简易的迷宫算法

    简易的迷宫算法 js实现简单的迷宫模版生成

Global site tag (gtag.js) - Google Analytics