• 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+"	");
    			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;
    	}
    }
    

      

  • 相关阅读:
    == 与 equals 之区别
    值传递和引用传递
    try-catch-finally容易犯的错误
    设计模式之备忘录模式
    设计模式之观察者模式 Observer
    设计模式之状态模式 State
    设计模式之模板方法模式 templateMethod
    设计模式之策略模式 Strategy
    Java过滤器与SpringMVC拦截器之间的关系与区别
    SpringMVC中使用Interceptor拦截器
  • 原文地址:https://www.cnblogs.com/lixiaolun/p/4645830.html
Copyright © 2020-2023  润新知