深度优先算法DFS

深度优先算法的Java实现

public class JavaDFS {
    public int stepnum = 999;
    /*构建11*11的迷宫,英雄H在(1,1)的位置出发,去解救美女M(6,8),#表示墙壁,*表示炸弹*/
    public char[][] graph = {
            {‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘},
            {‘#‘,‘H‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘*‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘*‘,‘#‘},
            {‘#‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘M‘,‘_‘,‘#‘},
            {‘#‘,‘*‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘_‘,‘_‘,‘_‘,‘*‘,‘_‘,‘_‘,‘_‘,‘_‘,‘_‘,‘#‘},
            {‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘,‘#‘},
    };

    /*初始标记数组都为0*/
    public int[][] mark = new int[graph.length][graph.length];
    /*每一个位置有四种选择:右、下、左、上*/
    public int[][] choose = {
            {0,1},{1,0},{0,-1},{-1,0}
    };
    public void DFS(int x,int y, int step) {
        /*找到美女M*/
        if (graph[x][y] == ‘M‘)
        {
            if(step < stepnum)//更新最小step
            {
                System.out.println("this way is smaller"+step);
                stepnum = step;
            }
            return;//找到之后立即返回,不再继续
        }

        //新位置
        int tx = 0;
        int ty = 0;
        for(int i=0;i<4;i++)
        {
            tx = x + choose[i][0];
            ty = y + choose[i][1];
            if(graph[tx][ty] != ‘#‘
                    && graph[tx][ty] != ‘*‘
                    && mark[tx][ty] == 0)//没有遇到炸弹,没有墙,并且路径没有标记走过
            {
                mark[tx][ty] = 1;//标记该点已经走过
                DFS(tx,ty,step+1);
                mark[tx][ty] = 0;//取消该点的标记
            }
        }
        return;
    }

    public static void main(String[] args) {
        JavaDFS myDFS = new JavaDFS();
        myDFS.mark[1][1] = 1;
        System.out.println("start finding MM:");
        long start = System.currentTimeMillis();
        /*英雄H从(1,1)出发,step初始为0*/
        myDFS.DFS(1,1,0);
        long end = System.currentTimeMillis();

        System.out.println("end finding MM:step= " + myDFS.stepnum + "time=" + (end-start));
    }
}

(1)输出结果:发现非常耗时,居然有2min。是不是我的代码有问题?

start finding MM:
this way is smaller14
this way is smaller12
end finding MM: step= 12 time=150931

(2)DFS不能记录具体的路径值

时间: 2025-01-01 23:15:58

深度优先算法DFS的相关文章

【算法入门】深度优先搜索(DFS)

深度优先搜索(DFS) [算法入门] 1.前言深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需最短

深度优先搜索 dfs C++实现

#include<map> #include<iostream> #include<string> #include<vector> using namespace std; static vector<string> order; static map<string, int > vis; void dfs(map<string, vector<string> > link, string top) {  o

求水洼的问题(或者是说求图中连通子图的个数)----深度优先算法

遇到这个题的时候,不太容易快速的想到思路:可能会比较容易想到使用递归的思想:但是具体怎么写呢?其实这个题就相当于是图论中的求连通图,很容易应该想到的是深度优先搜索或者是广度优先搜索:我们就用深度优先算法来求这个题目:直接求有几个区域不好求,那么我们换个思路来求,这种题就是这样,直接求不好求,但是当我们转换一下思路之后就豁然开朗: 我们遍历所有的点,当遇到有水的点时,就将它周围的(八个方向)所有的水点都消除:所以在主遍历for循环中遇到几个水点就是有几个水洼: /*****************

在图中寻找最短路径-----深度优先算法C++实现

求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例,用深度优先算法来实现: 在每一个点都有四个方向(有的点的有些方向不能通过),所以在每一个点处要处理四种方向的情况: 深度优先算法函数怎么写? 也就是写递归函数...但是递归函数肿么写??? 第一:判断初始态,从起点出发,刚开始步数为0:dfs(start_x, start_y, 0); 第二:从起

深度优先算法——走迷宫的实现

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图

深度优先算法和广度优先算法

算法:深度优先算法和广度优先算法(基于邻接矩阵) 1.写在前面 图的存储结构有两种:一种是基于二维数组的邻接矩阵表示法. 另一种是基于链表的的邻接表. 在邻接矩阵中,可以如下表示顶点和边连接关系: 说明: 将顶点对应为下标,根据横纵坐标将矩阵中的某一位置值设为1,表示两个顶点向联接. 图示表示的是无向图的邻接矩阵,从中我们可以发现它们的分布关于斜对角线对称. 我们在下面将要讨论的是下图的两种遍历方法(基于矩阵的): 我们已经说明了我们要用到的是邻接矩阵表示法,那么我首先要来构造图: 矩阵图的数据

Java与算法之(5) - 老鼠走迷宫(深度优先算法)

小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先用一个二维数组来把迷宫"数字化". [java] view plain copy print? int[][] maze = new int[5][4]; 迷宫中每个格子的横纵坐标对应数组的一维和二维索引,例如最左上角的格子是maze[0][0],数组的值表示该格子是否可以通过,0表示可以

深度优先搜索(DFS)详解

深度优先搜索(DFS) [算法入门] 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 你可以跳过第二节先看第三节,:) 2.深度优先搜索VS广度优先搜索 2.1演示深度优先搜索的过程 还是引用上篇文章的样例图,起点仍然是V0,我们修改一下题目意思,只需要让你找出一条V0到V6的道路,而无需

深度优先算法+广度优先算法

一 深度优先算法 bool visited[MaxVnum]; void DFS(Graph G,int v) { visited[v]= true; //从V开始访问,flag它 printf("%d",v); //打印出V for(int j=0;j<G.vexnum;j++) if(G.arcs[v][j]==1&&visited[j]== false) //这里可以获得V未访问过的邻接点 DFS(G,j); //递归调用,如果所有节点都被访问过,就回溯,而