`
tianshi_kco
  • 浏览: 22769 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

迷宫问题

    博客分类:
  • java
 
阅读更多
import java.util.*;

public final class Demo
{
    
    
    //保存路径的栈
    private Stack<Point> stack = new Stack<Point>();
    private boolean findAWay = false;
    public Demo()
    {
        
    }
    
  /*
    功能:从一个迷宫走出的最短路徑
        
    输入:
        一个N*M的数组,int[][] maze迷宫图作为输入,如
        {0, 1, 0, 0, 0},
        {0, 1, 0, 1, 0}, 
        {0, 0, 0, 0, 0}, 
        {0, 1, 1, 1, 0}, 
        {0, 0, 0, 1, 0}};
        
    输出:从左上角到右下角的最短路线:(0, 0)(1, 0)(2, 0)(2, 1)(2, 2)(2, 3)(2, 4)(3, 4)(4, 4)
         
  */
    public Stack<Point> go(int[][] maze)
    {
        Point out = new Point(maze.length - 1, maze[0].length - 1); //出口
        Point in = new Point(0, 0); //入口
        maze = getNewMaze(maze);
        out = new Point(maze.length - 2,maze[0].length - 2);
        in = new Point(1, 1);
        findWay(maze, in, out);
        stack = reverseStack(in);
        return stack;
    }
    public Stack<Point> reverseStack(Point in){
    	Stack<Point> newStack = new Stack<Point>();
    	newStack.add(new Point(in.x - 1,in. y - 1));
    	for (int i = stack.size() - 1; i >= 0; i--) {
			newStack.add(stack.get(i));
		}
    	
    	return newStack;
    }
    public void findWay(int[][] maze,Point in,Point out){
    	if(in.x == out.x && in.y == out.y){
    		findAWay = true;
    		return;
    	}
    	int[][] newMaze = copyNewMaze(maze); 
    	newMaze[in.x][in.y] = 1;
    	if(newMaze[in.x][in.y + 1] == 0 && ! findAWay){
    		Point newIn = new Point(in.x,in.y + 1);
    		findWay(newMaze, newIn, out);
    		if(findAWay){
    			stack.push(new Point(newIn.x - 1,newIn.y - 1));
    			return ;
    		}
    	}
    	
    	if(newMaze[in.x + 1][in.y] == 0 && ! findAWay){
    		Point newIn = new Point(in.x + 1,in.y);
    		findWay(newMaze, newIn, out);
    		if(findAWay){
    			stack.push(new Point(newIn.x - 1,newIn.y - 1));
    			return ;
    		}
    	}
    	
    	if(newMaze[in.x - 1][in.y] == 0 && ! findAWay){
    		Point newIn = new Point(in.x - 1,in.y);
    		findWay(newMaze, newIn, out);
    		if(findAWay){
    			stack.push(new Point(newIn.x - 1,newIn.y - 1));
    			return ;
    		}
    	}
    	
    	if(newMaze[in.x][in.y - 1] == 0 && ! findAWay){
    		Point newIn = new Point(in.x,in.y - 1);
    		findWay(newMaze, newIn, out);
    		if(findAWay){
    			stack.push(new Point(newIn.x - 1,newIn.y - 1));
    			return ;
    		}
    	}
    	
    }
    public int[][] copyNewMaze(int[][] maze){
    	int n = maze.length;
    	int m = maze[0].length;
    	int[][] newMaze = new int[n][m];
    	for (int i = 0; i < maze.length; i++) {
			for (int j = 0; j <maze[i].length; j++) {
				newMaze[i][j] = maze[i][j];
			}
		}
    	return newMaze;
    }
    public int[][] getNewMaze(int[][] maze){
    	if(maze == null || maze.length == 0){
    		return null;
    	}
    	int n = maze.length;
    	int m = maze[0].length;
    	int[][] newMaze = new int[n+2][m+2];
    
    	Arrays.fill(newMaze[0], 0, m+2, 1);
    	for (int i = 0; i < maze.length; i++) {
			newMaze[i + 1][0] = 1;
			for (int j = 0; j < maze[i].length; j++) {
				newMaze[i + 1][j + 1] = maze[i][j];
			}
			newMaze[i + 1][maze[i].length + 1] = 1;
		}
    	Arrays.fill(newMaze[n+1], 0, m+2, 1);
    	return newMaze;
    }
}


/**\
 * 
 * 记录迷宫图的坐标
 * <功能详细描述>
 * 
 * @author  c00212430
 * @version  [版本号, 2013-11-27]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class Point 
{ 

    int x = 0;
    int y = 0;

    public Point() {
     this(0, 0);
    }

    public Point(int x, int y) {
     this.x = x;
     this.y = y;
    }

    public boolean equals(Point p) {
     return (x == p.x) && (y == p.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 String toString() {
     return "(" + x + ", " + y + ")";
    }
   }
分享到:
评论

相关推荐

    广度优先搜索解决迷宫问题_迷宫问题_

    迷宫问题是一个经典的图论问题,常常用于计算机科学和算法设计的教学中。在这个问题中,我们通常有一个二维网格,其中的每个单元格要么是通路(通常标记为0),要么是障碍物(标记为1)。目标是找到从起点到终点的一...

    迷宫问题,迷宫问题.doc

    迷宫问题的实验报告 迷宫问题,作为一个经典的数据结构与算法的实验主题,不仅能够帮助学生熟悉栈的用法,还能锻炼他们的试探法程序设计技能。在本实验报告中,我们将通过C++语言编写程序来解决迷宫问题,实现对...

    数据结构实验迷宫问题实验报告

    数据结构实验迷宫问题实验报告 本实验报告主要是关于数据结构实验中的迷宫问题,通过设计数据结构存储迷宫、设计存储结构保存从入口到出口的通路、设计算法完成迷宫问题的求解,并分析算法的时间复杂度。 首先,...

    迷宫问题求解

    迷宫的问题,代码解释的比较详细,当时写了好久才写出来的,基础要求低

    利用队列实现迷宫问题

    C++数据结构练习题,利用队列解决迷宫问题,完成出路的寻找

    实验5求解迷宫问题.doc

    实验5求解迷宫问题 本实验的主要目的是为了理解并验证实现迷宫问题,掌握蛮力法的具体应用。通过编程题,学生可以学习到蛮力法的实践应用,并解决迷宫问题。 知识点1:蛮力法 蛮力法是一种常用的解决迷宫问题的...

    迷宫问题.txt

    一个简单的C语言小游戏,迷宫游戏,画一幅简单的迷宫,在定义一个人,人在迷宫中前进

    回溯法解迷宫问题

    在本案例中,"回溯法解迷宫问题"是利用这种算法解决经典的迷宫寻路问题。 迷宫问题通常表现为一个二维矩阵,其中1表示墙壁,0表示可以通过的路径。目标是从起点(通常是迷宫的一个角落)到达终点,同时避开障碍物。...

    C语言实现迷宫问题

    C语言编写的一个简单迷宫问题。其中用到了数据结构,相对简单

    MG.rar_迷宫问题

    《迷宫问题与C语言实现解析》 迷宫问题,作为一个经典的计算机科学难题,涉及到图论、搜索算法以及数据结构等多个领域。在这个程序中,我们主要关注如何利用C语言来解决这一问题。C语言以其简洁高效的特点,常被...

    migong.rar_迷宫问题

    《迷宫问题详解与递归求解》 迷宫问题是一个经典的计算机科学问题,它涉及到图论、搜索算法以及递归等多方面的知识。在这个问题中,我们通常以二维矩阵的形式来表示迷宫,其中1代表可以通行的路径,0则表示障碍物。...

    mig.rar_迷宫问题

    标题中的“mig.rar_迷宫问题”表明这是一个关于解决迷宫问题的程序设计项目,可能包含源代码和相关的说明文档。描述中的“迷宫问题程序设计”进一步确认了这一点,意味着我们将探讨如何通过编程来解决迷宫路径寻找的...

    digui.rar_迷宫问题

    在IT领域,迷宫问题是一个经典的图论与算法问题,涉及到计算机科学中的路径搜索和遍历。本案例中,我们关注的是如何使用递归算法来解决这个问题。递归是一种解决问题的方法,它通过将问题分解为更小的子问题来解决大...

    zuoye.rar_迷宫问题

    在IT领域,迷宫问题是一个经典的算法问题,它通常与图论、搜索算法以及数据结构紧密相关。在“zuoye.rar_迷宫问题”这个压缩包中,我们可以期待找到一系列关于迷宫问题的实例、测试数据以及可能的解决方案,这对于...

Global site tag (gtag.js) - Google Analytics