import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MazePath { public static void main(String[] args) { int[][] maze = {{0, 1, 0, 0, 0, 0}, {0, 1, 1, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0}, {0, 1, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0}}; Position start = new Position(0, 0); Position end = new Position(5, 5); List<Position> pathWay = new ArrayList<Position>(); pathWay.add(start); mazePath(maze, pathWay, end); for(int i=0; i<mazeList.size(); i++) { int[][] temp = mazeList.get(i); for(int[] temp1: temp) { System.out.println(Arrays.toString(temp1)); } System.out.println(rightWayToEnd.get(i).size()); } } public static List<List<Position>> rightWayToEnd = new ArrayList<List<Position>>(); public static List<int[][]> mazeList = new ArrayList<int[][]>(); public static int lastX = 5; public static int lastY = 5; public static void mazePath(int[][] maze, List<Position> pathWay, Position end) { Position lastPos = pathWay.get(pathWay.size() - 1); //顺时针 左边相邻 if(lastPos.x+1<=lastX){ Position leftPos = new Position(lastPos.x+1, lastPos.y); if(notInMaze(maze, leftPos) && notInPathWay(pathWay, leftPos)) { int[][] maze1 = getNewArray(maze); List<Position> pathWay1 = getNewList(pathWay); pathWay1.add(leftPos); maze1[leftPos.x][leftPos.y] = 2; if(isEndPos(leftPos, end)) { rightWayToEnd.add(pathWay1); mazeList.add(maze1); } else { mazePath(maze1, pathWay1, end); } } } //顺时针 下边相邻 if(lastPos.y+1<=lastY){ Position bottomPos = new Position(lastPos.x, lastPos.y+1); if(notInMaze(maze, bottomPos) &¬InPathWay(pathWay, bottomPos)) { int[][] maze1 = getNewArray(maze); List<Position> pathWay1 = getNewList(pathWay); pathWay1.add(bottomPos); maze1[bottomPos.x][bottomPos.y] = 2; if(isEndPos(bottomPos, end)) { rightWayToEnd.add(pathWay1); mazeList.add(maze1); } else { mazePath(maze1, pathWay1, end); } } } //顺时针 右边相邻 if(lastPos.x-1>=0){ Position rightPos = new Position(lastPos.x-1, lastPos.y); if(notInMaze(maze, rightPos) &¬InPathWay(pathWay, rightPos)) { int[][] maze1 = getNewArray(maze); List<Position> pathWay1 = getNewList(pathWay); pathWay1.add(rightPos); maze1[rightPos.x][rightPos.y] = 2; if(isEndPos(rightPos, end)) { rightWayToEnd.add(pathWay1); mazeList.add(maze1); } else { mazePath(maze1, pathWay1, end); } } } //顺时针上边相邻 if(lastPos.y-1>=0){ Position topPos = new Position(lastPos.x, lastPos.y-1); if(notInMaze(maze, topPos) &¬InPathWay(pathWay, topPos)) { int[][] maze1 = getNewArray(maze); List<Position> pathWay1 = getNewList(pathWay); pathWay1.add(topPos); maze1[topPos.x][topPos.y] = 2; if(isEndPos(topPos, end)) { rightWayToEnd.add(pathWay1); mazeList.add(maze1); } else { mazePath(maze1, pathWay1, end); } } } } private static int[][] getNewArray(int[][] maze) { int[][] newMaze = new int[maze.length][maze[0].length]; 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; } private static List<Position> getNewList(List<Position> pathWay) { List<Position> newList = new ArrayList<Position>(); for(Position tempPos: pathWay) { Position newPos = new Position(tempPos.x, tempPos.y); newList.add(newPos); } return newList; } private static boolean isEndPos(Position leftPos, Position end) { boolean flag = false; if(end.x == leftPos.x && end.y == leftPos.y) { flag = true; } return flag; } private static boolean notInPathWay(List<Position> pathWay, Position position) { boolean flag = true; for(Position temp : pathWay) { if(temp.x == position.x && temp.y == position.y){ flag = false; } } return flag; } private static boolean notInMaze(int[][] maze, Position position) { boolean flag = false; if(maze[position.x][position.y] == 0) { flag = true; } return flag; } }
public class Position { public int x; public int 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; } public Position(){ } public Position(int x, int y) { this.x = x; this.y = y; } }
相关推荐
在本课程设计中,我们将深入探讨迷宫求解这一经典问题。迷宫求解是计算机科学中的一个重要领域,它涉及到图论、算法设计与分析等多个方面。在这个项目中,我们将学习如何利用不同的方法来解决这类问题,从而提高我们...
《数据结构习题:迷宫求解程序》 在计算机科学中,数据结构与算法是构建高效软件的基础,其中迷宫求解问题就是一个经典的数据结构应用实例。本项目以“数据结构习题迷宫求解程序”为主题,采用C++编程语言,利用MFC...
根据给定的信息,本文将对“数据结构之迷宫求解C++”这一主题进行深入解析,主要包括迷宫求解的背景、所涉及的关键数据结构、算法原理以及具体实现细节。 ### 迷宫求解背景 迷宫求解是计算机科学中的一个经典问题...
《VC源代码:迷宫求解的深度探索》 在计算机科学领域,迷宫求解是一种常见的算法问题,它涉及到路径查找、图论以及搜索算法等核心概念。在这个专题中,我们将深入探讨如何使用VC++(Visual C++ 6.0)作为开发环境,...
DFS在迷宫求解中会形成一条“回路”,如果找到出口则结束搜索,否则会在所有可能的路径上穷尽。 2. **广度优先搜索(BFS,Breadth-First Search)**:与DFS不同,BFS使用队列数据结构,从起点开始,逐层扩展到相邻...
标题 "迷宫求解C++源代码(回溯法)" 涉及到的核心知识点是计算机算法中的迷宫求解问题以及编程语言C++的应用,特别是使用回溯法来解决此类问题。回溯法是一种试探性的解决问题的方法,它尝试分步地找到问题的解,...
总之,迷宫求解是一个典型的计算机科学问题,它展示了如何利用递归和回溯策略解决复杂的问题。通过深入理解这些概念,不仅可以解决迷宫问题,还可以应用到其他类似的路径寻找、搜索和优化问题中。
根据给定的文件信息,我们可以总结出以下关于“C++版小程序--迷宫求解问题”的详细知识点: ### 一、程序结构与功能 #### 1. 标准输入输出库与字符串处理 - `#include <iostream>`:引入标准输入输出流库,用于...
综上所述,本文详细介绍了如何使用 C 语言中的结构体、栈以及递归等数据结构和算法来解决迷宫求解问题。通过合理的数据结构设计和高效的算法实现,不仅能够简化问题的复杂度,还能提高程序的可读性和维护性。
2. **设置起点和终点**:确定迷宫的入口和出口位置。 3. **实现搜索算法**:根据DFS或BFS的逻辑编写相应的函数。 4. **路径回溯**:找到解决方案后,回溯路径并输出。 5. **错误处理**:考虑无解情况,确保程序在...
2. **探索**:从当前节点出发,尝试所有可能的移动(上、下、左、右,根据迷宫的规则),进入未访问的邻接节点。 3. **递归**:对于每个新进入的节点,重复步骤2,将其作为新的当前节点。 4. **回溯**:如果到达终点...
### 数据结构中用栈实现迷宫求解 #### 背景与意义 在计算机科学领域,迷宫求解是一个经典的问题,它不仅涉及到数据结构的应用,还涉及到算法的设计与优化。通过解决这类问题,我们可以更好地理解算法的工作原理...
在本次的“迷宫求解(2)数据结构课程设计”中,我们主要探讨的是如何利用数据结构和算法解决实际问题,特别是迷宫求解这一经典问题。在计算机科学领域,迷宫求解是一个常见的练习,它能很好地展示图遍历、深度优先...
- **递归策略**:从入口开始探索所有可能的路径,递归地尝试每一个可行的方向,直到找到出口或确定无路可走为止。 - **标记已访问**:为了防止重复访问同一个位置,可以在访问过的位置做标记。 - **回溯**:当到达...
在IT领域,迷宫路径求解是一个经典的图论和算法问题,它涉及到计算机科学中的搜索算法,如深度优先搜索(DFS)和广度优先搜索(BFS)。这个问题通常被用来训练程序员解决复杂的问题,比如在有限的空间内找到从起点到...
p栈存储已确定的路径,q栈记录正在探索的节点。初始时,起点(1,1)被压入栈中,并标记为已访问。在循环中,我们每次取出q栈的顶部节点,检查其所有相邻节点。如果找到可达的新节点,就将新节点压入q栈,并更新p栈。...
- 使用适当的数据结构和算法可以显著提高迷宫求解的效率。例如,使用哈希表存储已访问节点可以减少查找时间。 通过对“数据结构实习-简单迷宫系统”的学习,学生不仅可以掌握基本的数据结构和算法,还能提升问题...
本课程设计的主要目的是通过使用C语言实现一个迷宫求解器,旨在帮助学生深入理解C语言中的核心概念,如数组、函数、递归等,并通过解决实际问题的方式提高编程能力。 #### 二、关键技术点详解 ##### 1. 定义迷宫...
本文将深入探讨如何利用递归算法来解决这一问题,以"ALGO3-9.zip_迷宫算法"为例,通过解析其中的ALGO3-9.c源代码,我们将揭示递归在迷宫求解中的强大应用。 首先,我们需要理解迷宫的基本结构。迷宫通常表示为二维...