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 + ")";
}
}
分享到:
相关推荐
迷宫问题的实验报告 迷宫问题,作为一个经典的数据结构与算法的实验主题,不仅能够帮助学生熟悉栈的用法,还能锻炼他们的试探法程序设计技能。在本实验报告中,我们将通过C++语言编写程序来解决迷宫问题,实现对...
数据结构实验迷宫问题实验报告 本实验报告主要是关于数据结构实验中的迷宫问题,通过设计数据结构存储迷宫、设计存储结构保存从入口到出口的通路、设计算法完成迷宫问题的求解,并分析算法的时间复杂度。 首先,...
在计算机科学领域,迷宫问题是一个经典的问题,它涉及到路径搜索和图遍历算法。本文将深入探讨在C++环境中解决迷宫问题所涉及的知识点,包括基础的编程概念、数据结构以及算法。 首先,我们要了解C++语言基础。C++...
### 知识点一:迷宫问题背景及定义 在计算机科学中,迷宫问题是一种经典的搜索问题。题目描述了一个由0和1组成的m×n矩阵来表示迷宫,其中0表示可通行路径,1表示障碍物。目标是从迷宫的入口出发找到一条到达出口的...
### 数据结构程序设计-迷宫问题 #### 一、需求分析 迷宫问题是计算机科学领域内的一个典型问题,常用于教学和研究数据结构与算法。本项目旨在通过设计合适的数据结构和算法,解决一个给定的迷宫问题,即找出从迷宫...
数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...
《用栈解决迷宫问题的实验报告》 一、需求分析 在本次实验中,我们需要设计一个程序来解决迷宫问题。迷宫采用结构体Maze进行表示,其中包括以下关键属性: 1. pos:用于标记该位置是否存在障碍,通常用0表示通路,...
迷宫问题(C语言源代码) 迷宫问题是计算机科学中的一种经典问题,旨在找到从迷宫入口到出口的路径。在这个问题中,我们使用C语言编写了一个迷宫问题的解决方案,该方案使用栈来实现迷宫的搜索。 问题描述 迷宫...
在本案例中,"回溯法解迷宫问题"是利用这种算法解决经典的迷宫寻路问题。 迷宫问题通常表现为一个二维矩阵,其中1表示墙壁,0表示可以通过的路径。目标是从起点(通常是迷宫的一个角落)到达终点,同时避开障碍物。...
在给定的信息中,我们看到的是一个使用C语言实现的基于栈的数据结构来解决迷宫问题的示例。迷宫问题通常涉及到在一个二维网格中找到从起点到终点的有效路径,而这里的解决方案是通过广度优先搜索(BFS)或者深度优先...
### 数据结构与算法在迷宫问题中的应用 #### 背景介绍 迷宫问题是计算机科学领域中的一个经典问题,通常用于演示各种搜索算法的工作原理。在这个特定的问题中,我们面临的是一个M×N的矩阵,其中0表示通路而1则代表...
在IT领域,迷宫问题是一种经典的图论问题,它涉及到如何在一个二维网格中找到从起点到终点的最短路径。通常,我们可以通过多种算法来解决这个问题,其中之一就是使用队列的广度优先搜索(BFS)策略。在这个方法中,...
迷宫问题是一个经典的图论问题,常常用于计算机科学和算法设计的教学中。在这个问题中,我们通常有一个二维网格,其中的每个单元格要么是通路(通常标记为0),要么是障碍物(标记为1)。目标是找到从起点到终点的一...
在IT领域,迷宫问题是一种常见的算法挑战,它与数据结构紧密相关,特别是在设计和实现高效解决方案时。湖南大学可能在课程中涉及了这个主题,让学生深入理解数据结构的应用。迷宫问题通常要求找到从起点到终点的最短...
### C语言课程设计_迷宫问题 #### 一、项目背景与目标 本课程设计的主要目的是通过使用C语言实现一个迷宫求解器,旨在帮助学生深入理解C语言中的核心概念,如数组、函数、递归等,并通过解决实际问题的方式提高...
在IT领域,迷宫问题是一个经典的路径搜索问题,它经常被用来锻炼算法思维和编程技巧。迷宫可以被抽象为一个二维网格,其中每个单元格要么是通路(可通行),要么是墙壁(不可通行)。目标是找到从起点到终点的有效...
【数据结构迷宫问题实习作业】是一个典型的计算机科学问题,主要涉及到数据结构和算法的应用。在这个实习项目中,我们利用二维数组来表示一个m*n的迷宫,其中0表示可以通过的路径,1表示障碍物。目标是设计一个程序...
Java图形界面迷宫问题 Java图形界面迷宫问题是使用Java语言编写的图形用户界面程序,目的是解决迷宫问题。本节将详细介绍Java图形界面迷宫问题的实现原理、关键技术点和实际应用。 Java图形界面 Java图形界面是...
在迷宫问题中,AStar算法被广泛应用,能够高效地解决从起点到终点的寻路问题。 AStar算法的核心思想可以分为以下几个步骤: 1. **定义图**:将迷宫视为一个图,其中每个节点代表一个位置,边则表示相邻的可通行...