`
MauerSu
  • 浏览: 513958 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

已确定迷宫求解所有路线(递归)

 
阅读更多
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) &&notInPathWay(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) &&notInPathWay(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) &&notInPathWay(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++

    根据给定的信息,本文将对“数据结构之迷宫求解C++”这一主题进行深入解析,主要包括迷宫求解的背景、所涉及的关键数据结构、算法原理以及具体实现细节。 ### 迷宫求解背景 迷宫求解是计算机科学中的一个经典问题...

    vc源代码_迷宫求解

    《VC源代码:迷宫求解的深度探索》 在计算机科学领域,迷宫求解是一种常见的算法问题,它涉及到路径查找、图论以及搜索算法等核心概念。在这个专题中,我们将深入探讨如何使用VC++(Visual C++ 6.0)作为开发环境,...

    迷宫求解问题.rar

    DFS在迷宫求解中会形成一条“回路”,如果找到出口则结束搜索,否则会在所有可能的路径上穷尽。 2. **广度优先搜索(BFS,Breadth-First Search)**:与DFS不同,BFS使用队列数据结构,从起点开始,逐层扩展到相邻...

    迷宫求解C++源代码(回溯法)

    标题 "迷宫求解C++源代码(回溯法)" 涉及到的核心知识点是计算机算法中的迷宫求解问题以及编程语言C++的应用,特别是使用回溯法来解决此类问题。回溯法是一种试探性的解决问题的方法,它尝试分步地找到问题的解,...

    迷宫求解之回溯

    总之,迷宫求解是一个典型的计算机科学问题,它展示了如何利用递归和回溯策略解决复杂的问题。通过深入理解这些概念,不仅可以解决迷宫问题,还可以应用到其他类似的路径寻找、搜索和优化问题中。

    C++版小程序--迷宫求解问题

    根据给定的文件信息,我们可以总结出以下关于“C++版小程序--迷宫求解问题”的详细知识点: ### 一、程序结构与功能 #### 1. 标准输入输出库与字符串处理 - `#include &lt;iostream&gt;`:引入标准输入输出流库,用于...

    数据结构 迷宫求解

    综上所述,本文详细介绍了如何使用 C 语言中的结构体、栈以及递归等数据结构和算法来解决迷宫求解问题。通过合理的数据结构设计和高效的算法实现,不仅能够简化问题的复杂度,还能提高程序的可读性和维护性。

    数据结构课程设计迷宫问题求解 c

    2. **设置起点和终点**:确定迷宫的入口和出口位置。 3. **实现搜索算法**:根据DFS或BFS的逻辑编写相应的函数。 4. **路径回溯**:找到解决方案后,回溯路径并输出。 5. **错误处理**:考虑无解情况,确保程序在...

    用2中方法解决迷宫问题

    2. **探索**:从当前节点出发,尝试所有可能的移动(上、下、左、右,根据迷宫的规则),进入未访问的邻接节点。 3. **递归**:对于每个新进入的节点,重复步骤2,将其作为新的当前节点。 4. **回溯**:如果到达终点...

    数据结构中 用栈实现迷宫求解

    ### 数据结构中用栈实现迷宫求解 #### 背景与意义 在计算机科学领域,迷宫求解是一个经典的问题,它不仅涉及到数据结构的应用,还涉及到算法的设计与优化。通过解决这类问题,我们可以更好地理解算法的工作原理...

    迷宫求解(2)数据结构课程设计

    在本次的“迷宫求解(2)数据结构课程设计”中,我们主要探讨的是如何利用数据结构和算法解决实际问题,特别是迷宫求解这一经典问题。在计算机科学领域,迷宫求解是一个常见的练习,它能很好地展示图遍历、深度优先...

    c语言递归解决八皇后 迷宫 汉诺塔 源码

    - **递归策略**:从入口开始探索所有可能的路径,递归地尝试每一个可行的方向,直到找到出口或确定无路可走为止。 - **标记已访问**:为了防止重复访问同一个位置,可以在访问过的位置做标记。 - **回溯**:当到达...

    迷宫路径求解

    在IT领域,迷宫路径求解是一个经典的图论和算法问题,它涉及到计算机科学中的搜索算法,如深度优先搜索(DFS)和广度优先搜索(BFS)。这个问题通常被用来训练程序员解决复杂的问题,比如在有限的空间内找到从起点到...

    迷宫问题课程设计报告

    p栈存储已确定的路径,q栈记录正在探索的节点。初始时,起点(1,1)被压入栈中,并标记为已访问。在循环中,我们每次取出q栈的顶部节点,检查其所有相邻节点。如果找到可达的新节点,就将新节点压入q栈,并更新p栈。...

    数据结构实习-简单迷宫系统

    - 使用适当的数据结构和算法可以显著提高迷宫求解的效率。例如,使用哈希表存储已访问节点可以减少查找时间。 通过对“数据结构实习-简单迷宫系统”的学习,学生不仅可以掌握基本的数据结构和算法,还能提升问题...

    C语言课程设计_迷宫问题

    本课程设计的主要目的是通过使用C语言实现一个迷宫求解器,旨在帮助学生深入理解C语言中的核心概念,如数组、函数、递归等,并通过解决实际问题的方式提高编程能力。 #### 二、关键技术点详解 ##### 1. 定义迷宫...

    ALGO3-9.zip_迷宫算法

    本文将深入探讨如何利用递归算法来解决这一问题,以"ALGO3-9.zip_迷宫算法"为例,通过解析其中的ALGO3-9.c源代码,我们将揭示递归在迷宫求解中的强大应用。 首先,我们需要理解迷宫的基本结构。迷宫通常表示为二维...

Global site tag (gtag.js) - Google Analytics