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)。目标是找到从起点到终点的一...
迷宫问题的实验报告 迷宫问题,作为一个经典的数据结构与算法的实验主题,不仅能够帮助学生熟悉栈的用法,还能锻炼他们的试探法程序设计技能。在本实验报告中,我们将通过C++语言编写程序来解决迷宫问题,实现对...
数据结构实验迷宫问题实验报告 本实验报告主要是关于数据结构实验中的迷宫问题,通过设计数据结构存储迷宫、设计存储结构保存从入口到出口的通路、设计算法完成迷宫问题的求解,并分析算法的时间复杂度。 首先,...
迷宫的问题,代码解释的比较详细,当时写了好久才写出来的,基础要求低
C++数据结构练习题,利用队列解决迷宫问题,完成出路的寻找
实验5求解迷宫问题 本实验的主要目的是为了理解并验证实现迷宫问题,掌握蛮力法的具体应用。通过编程题,学生可以学习到蛮力法的实践应用,并解决迷宫问题。 知识点1:蛮力法 蛮力法是一种常用的解决迷宫问题的...
一个简单的C语言小游戏,迷宫游戏,画一幅简单的迷宫,在定义一个人,人在迷宫中前进
在本案例中,"回溯法解迷宫问题"是利用这种算法解决经典的迷宫寻路问题。 迷宫问题通常表现为一个二维矩阵,其中1表示墙壁,0表示可以通过的路径。目标是从起点(通常是迷宫的一个角落)到达终点,同时避开障碍物。...
C语言编写的一个简单迷宫问题。其中用到了数据结构,相对简单
《迷宫问题与C语言实现解析》 迷宫问题,作为一个经典的计算机科学难题,涉及到图论、搜索算法以及数据结构等多个领域。在这个程序中,我们主要关注如何利用C语言来解决这一问题。C语言以其简洁高效的特点,常被...
《迷宫问题详解与递归求解》 迷宫问题是一个经典的计算机科学问题,它涉及到图论、搜索算法以及递归等多方面的知识。在这个问题中,我们通常以二维矩阵的形式来表示迷宫,其中1代表可以通行的路径,0则表示障碍物。...
标题中的“mig.rar_迷宫问题”表明这是一个关于解决迷宫问题的程序设计项目,可能包含源代码和相关的说明文档。描述中的“迷宫问题程序设计”进一步确认了这一点,意味着我们将探讨如何通过编程来解决迷宫路径寻找的...
在IT领域,迷宫问题是一个经典的图论与算法问题,涉及到计算机科学中的路径搜索和遍历。本案例中,我们关注的是如何使用递归算法来解决这个问题。递归是一种解决问题的方法,它通过将问题分解为更小的子问题来解决大...
在IT领域,迷宫问题是一个经典的算法问题,它通常与图论、搜索算法以及数据结构紧密相关。在“zuoye.rar_迷宫问题”这个压缩包中,我们可以期待找到一系列关于迷宫问题的实例、测试数据以及可能的解决方案,这对于...