`

图的深度优先搜索-求解迷宫解空间

阅读更多
1.原理描述:
  给定图G的初始状态是所有顶点均未曾访问过,在G中任选一顶点V为初始出发点(源点、根结点)。
则描述如下:首先访问出发点V,并将其标记为已访问过;然后依次从V出发搜索V的每个邻接点(子结点)W。
若W未曾访问过,则以W为新的出发点继续进行深度优先遍历,直到图中所有和源点V有路径相同的顶点(从源点
可达的顶点)均已被访问为止。若此图中仍有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复
上述过程,直到图中所有顶点均已被访问为止。

2.算法描述
  (1) 确定图的存储方式。
  (2) 设计搜索过程中的操作,其中包括为输出问题解而进行的存储操作。
  (3) 搜索到问题的解,则输出;否则回溯。
  (4) 一般在回溯前应该将结点恢复为原始状态,特别是在多解问题中。

3.一种实现:走迷宫问题。给定入口,求解搜索到出口的解空间。

package com.maozj.datastruct.graphic;

/**
 * create on 2010.05.15 说明:图的深度优先搜索
 * 
 * @author 毛正吉
 * @version v1.0
 * 
 * 
 */
public class DeepSearch {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		DeepSearch ds = new DeepSearch();
		ds.search(0, 0);
		System.out.println("\n"+ds.getTotal());
	}

	private int[][] maze = {
			{ 0, 0, 0, 0, 0, 0, 0, 0 },
			{ 0, 1, 1, 1, 1, 0, 1, 0 }, 
			{ 0, 0, 0, 0, 1, 0, 1, 0 },
			{ 0, 1, 0, 0, 0, 0, 1, 0 }, 
			{ 0, 1, 0, 1, 1, 0, 1, 0 },
			{ 0, 1, 0, 0, 0, 0, 1, 1 }, 
			{ 0, 1, 0, 0, 1, 0, 0, 0 },
			{ 0, 1, 1, 1, 1, 1, 1, 0 } };
	
	private int[] fx = { 1, -1, 0, 0 };
	private int[] fy = { 0, 0, -1, 1 };
	private int total;

	public DeepSearch() {
		total = 0;
		// 入口坐标设置已走标志
		maze[0][0] = 3;
	}

	public void search(int i, int j) {
		int k, newi, newj;
		// 搜索可达的方格
		for (k = 0; k < 4; k++)
			if (check(i, j, k)) {
				newi = i + fx[k];
				newj = j + fy[k];
				// 来到新位置后,设置已走过标志
				maze[newi][newj] = 3;
				// 如到出口则输出,否则下一步递归
				if (newi == 7 && newj == 7) {
					Out();
				} else {
					search(newi, newj);
				}
			}
		// 标识走入死胡同的方格
		maze[i][j] = 2;
	}

	public void Out() {
		int i, j;
		for (i = 0; i < 8; i++) {
			System.out.println("");
			for (j = 0; j < 8; j++) {
				if (maze[i][j] == 3) {
					System.out.print("V");
					total++;
				} else {
					System.out.print("*");
				}
			}
		}
	}

	public boolean check(int i, int j, int k) {
		boolean bool = true;
		i += fx[k];
		j += fy[k];
		if (i < 0 || i > 7 || j < 0 || j > 7) {// 是否在迷宫内
			bool = false;
		} else if (maze[i][j] != 0) {// 是否可行
			bool = false;
		}
		return bool;
	}

	public int getTotal() {
		return total;
	}

}
分享到:
评论

相关推荐

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

    - **深度优先搜索(DFS)**:本小程序的核心算法采用了深度优先搜索策略,通过递归或栈的方式来遍历迷宫的每一个可能路径,直到找到终点或确定无路可走为止。 - **路径记录**:通过`Step`结构体数组记录下每一个有效的...

    广度优先搜索构建迷宫(BFS算法)动态构建过程_深度优先算法时间复杂度

    **深度优先搜索(DFS)**是另一种搜索策略,与BFS不同的是,它深入探索每一个分支直至尽头,然后再回溯。DFS在迷宫生成中也有应用,特别是在解决迷宫问题时,但其不保证生成的路径是最短的。 在时间复杂度方面,BFS...

    数据结构课程设计--迷宫求解MFC版 含设计文档

    迷宫求解是一个经典的问题,它涉及到深度优先搜索(DFS)、广度优先搜索(BFS)等算法。 在数据结构中,迷宫可以被抽象为图或矩阵,每个节点代表一个位置,边则表示相邻的位置。本项目包含了两个关键部分:迷宫的生成和...

    基于A搜索和深度优先搜索解迷宫问题完整项目代码

    本文利用A*算法求解迷宫,按照A*算法的思想,针对迷宫问题提出了求解方案、制定了启发函数、在搜索中使用启发信息,缩小搜索的空间,尽快的求得问题的解,并编程验证了该算法的有效性。 关键词:迷宫问题 ;A*算法...

    基于深度优先搜索实现迷宫

    深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法,常用于解决迷宫问题。在这个项目中,我们将探讨如何利用DFS来实现迷宫的求解,并结合Python编程语言和相关的资源文件进行实践。 首先,...

    10-作业一-迷宫求解.rar

    在计算机科学中,迷宫求解是一个经典的路径寻找问题,通常涉及图论、深度优先搜索(DFS)、广度优先搜索(BFS)等算法。我们可以从以下几个方面深入探讨这个话题: 1. **迷宫表示**:迷宫通常被表示为二维网格,其中每...

    图的深度优先和广度优先搜索动态演示图3张

    图的深度优先搜索(DFS, Depth-First Search)和广度优先搜索(BFS, Breadth-First Search)是图论中的两种基本遍历算法,它们在计算机科学中有着广泛的应用,例如在解决网络爬虫、迷宫求解、社交网络分析等问题时。...

    数据结构迷宫求解

    迷宫求解问题可以被看作是图的遍历或者搜索问题,通常采用深度优先搜索(DFS)或广度优先搜索(BFS)策略来解决。在C++编程环境下,我们可以利用数组或链表等数据结构来表示迷宫,并通过编程实现寻找路径。 ...

    用递归与非递归求解迷宫问题

    递归方法通常基于深度优先搜索(DFS)。在DFS中,我们从起点开始,尝试向四个方向(上、下、左、右)移动,直到找到终点或者遇到死胡同。每到达一个新的位置,我们都会在该位置打上标记,防止回溯时再次进入。如果在...

    数据结构课设-漫步迷宫

    在数据结构的学习中,"漫步迷宫"是一个经典的问题,它涵盖了深度优先搜索(DFS)、广度优先搜索(BFS)、图遍历等重要概念。这个课程设计旨在帮助学生深入理解这些理论,并通过实际编程来提升问题解决能力。下面我们将...

    迷宫求解问题.rar

    1. **深度优先搜索(DFS,Depth-First Search)**:这是一种递归的搜索策略,它沿着一条路径深入探索,直到无法再前进为止,然后回溯到前一个节点尝试其他分支。DFS在迷宫求解中会形成一条“回路”,如果找到出口则...

    数据结构之迷宫求解c++

    栈具有后进先出(LIFO)的特点,非常适合用于深度优先搜索(DFS)算法。该算法会尽可能深地探索迷宫中的每一条路径,直到找到目标位置或者确定没有路径可走。 #### 栈的定义与实现 在代码中,定义了一个名为`Stack...

    迷宫求解算法

    迷宫求解通常可以采用深度优先搜索(DFS)或广度优先搜索(BFS)等图遍历算法来实现。本例中的迷宫求解采用了深度优先搜索的思想,通过栈这一数据结构来辅助递归过程的实现。 #### 三、关键概念与术语 1. **深度优先...

    迷宫求解MFC代码

    1. **深度优先搜索(DFS)**:DFS是一种常用的遍历策略,适合解决迷宫问题。从起点开始,沿着一条路径不断探索,直到找到终点或者无法前进(遇到墙壁)。如果无法前进,就回溯到上一步,尝试其他路径。 2. **广度优先...

    数据结构(C语言版)迷宫求解问题

    在这个场景下,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)策略来寻找出路。 1. **深度优先搜索**(DFS):DFS是一种递归策略,它沿着一条路径尽可能深地探索,直到遇到死胡同再回溯。在非递归实现中,...

    c语言迷宫问题求解

    在C语言中,解决迷宫问题的一种常见方法是使用深度优先搜索(DFS)或广度优先搜索(BFS)。DFS从起点开始,探索所有可能的路径,直到找到一条到达终点的路径。BFS则通过一个队列来保证找到的路径是最短的。 代码中...

    c++ 深度优先 源程序

    在实际编程中,深度优先搜索有多种应用场景,比如求解图的连通性、寻找最短路径、解决八皇后问题等。它与广度优先搜索(BFS)相比,各有优缺点:DFS常用于解决空间限制较大的问题,而BFS则适用于寻找最短路径。在...

    求解迷宫路线的matlab程序

    - **深度优先搜索(DFS)**:一种常用的遍历或搜索策略,沿着每条路径一直探索到底,直到找到目标或所有路径都尝试过。 - **广度优先搜索(BFS)**:从起点开始,逐层探索所有可能的路径,BFS通常能找到最短路径。 - ...

Global site tag (gtag.js) - Google Analytics