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;
}
}
分享到:
相关推荐
- **深度优先搜索(DFS)**:本小程序的核心算法采用了深度优先搜索策略,通过递归或栈的方式来遍历迷宫的每一个可能路径,直到找到终点或确定无路可走为止。 - **路径记录**:通过`Step`结构体数组记录下每一个有效的...
**深度优先搜索(DFS)**是另一种搜索策略,与BFS不同的是,它深入探索每一个分支直至尽头,然后再回溯。DFS在迷宫生成中也有应用,特别是在解决迷宫问题时,但其不保证生成的路径是最短的。 在时间复杂度方面,BFS...
迷宫求解是一个经典的问题,它涉及到深度优先搜索(DFS)、广度优先搜索(BFS)等算法。 在数据结构中,迷宫可以被抽象为图或矩阵,每个节点代表一个位置,边则表示相邻的位置。本项目包含了两个关键部分:迷宫的生成和...
本文利用A*算法求解迷宫,按照A*算法的思想,针对迷宫问题提出了求解方案、制定了启发函数、在搜索中使用启发信息,缩小搜索的空间,尽快的求得问题的解,并编程验证了该算法的有效性。 关键词:迷宫问题 ;A*算法...
深度优先搜索(DFS,Depth-First Search)是一种用于遍历或搜索树或图的算法,常用于解决迷宫问题。在这个项目中,我们将探讨如何利用DFS来实现迷宫的求解,并结合Python编程语言和相关的资源文件进行实践。 首先,...
在计算机科学中,迷宫求解是一个经典的路径寻找问题,通常涉及图论、深度优先搜索(DFS)、广度优先搜索(BFS)等算法。我们可以从以下几个方面深入探讨这个话题: 1. **迷宫表示**:迷宫通常被表示为二维网格,其中每...
图的深度优先搜索(DFS, Depth-First Search)和广度优先搜索(BFS, Breadth-First Search)是图论中的两种基本遍历算法,它们在计算机科学中有着广泛的应用,例如在解决网络爬虫、迷宫求解、社交网络分析等问题时。...
迷宫求解问题可以被看作是图的遍历或者搜索问题,通常采用深度优先搜索(DFS)或广度优先搜索(BFS)策略来解决。在C++编程环境下,我们可以利用数组或链表等数据结构来表示迷宫,并通过编程实现寻找路径。 ...
递归方法通常基于深度优先搜索(DFS)。在DFS中,我们从起点开始,尝试向四个方向(上、下、左、右)移动,直到找到终点或者遇到死胡同。每到达一个新的位置,我们都会在该位置打上标记,防止回溯时再次进入。如果在...
在数据结构的学习中,"漫步迷宫"是一个经典的问题,它涵盖了深度优先搜索(DFS)、广度优先搜索(BFS)、图遍历等重要概念。这个课程设计旨在帮助学生深入理解这些理论,并通过实际编程来提升问题解决能力。下面我们将...
1. **深度优先搜索(DFS,Depth-First Search)**:这是一种递归的搜索策略,它沿着一条路径深入探索,直到无法再前进为止,然后回溯到前一个节点尝试其他分支。DFS在迷宫求解中会形成一条“回路”,如果找到出口则...
栈具有后进先出(LIFO)的特点,非常适合用于深度优先搜索(DFS)算法。该算法会尽可能深地探索迷宫中的每一条路径,直到找到目标位置或者确定没有路径可走。 #### 栈的定义与实现 在代码中,定义了一个名为`Stack...
迷宫求解通常可以采用深度优先搜索(DFS)或广度优先搜索(BFS)等图遍历算法来实现。本例中的迷宫求解采用了深度优先搜索的思想,通过栈这一数据结构来辅助递归过程的实现。 #### 三、关键概念与术语 1. **深度优先...
1. **深度优先搜索(DFS)**:DFS是一种常用的遍历策略,适合解决迷宫问题。从起点开始,沿着一条路径不断探索,直到找到终点或者无法前进(遇到墙壁)。如果无法前进,就回溯到上一步,尝试其他路径。 2. **广度优先...
在这个场景下,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)策略来寻找出路。 1. **深度优先搜索**(DFS):DFS是一种递归策略,它沿着一条路径尽可能深地探索,直到遇到死胡同再回溯。在非递归实现中,...
在C语言中,解决迷宫问题的一种常见方法是使用深度优先搜索(DFS)或广度优先搜索(BFS)。DFS从起点开始,探索所有可能的路径,直到找到一条到达终点的路径。BFS则通过一个队列来保证找到的路径是最短的。 代码中...
在实际编程中,深度优先搜索有多种应用场景,比如求解图的连通性、寻找最短路径、解决八皇后问题等。它与广度优先搜索(BFS)相比,各有优缺点:DFS常用于解决空间限制较大的问题,而BFS则适用于寻找最短路径。在...
- **深度优先搜索(DFS)**:一种常用的遍历或搜索策略,沿着每条路径一直探索到底,直到找到目标或所有路径都尝试过。 - **广度优先搜索(BFS)**:从起点开始,逐层探索所有可能的路径,BFS通常能找到最短路径。 - ...