码迷,mamicode.com
首页 > 编程语言 > 详细

深度优先算法DFS

时间:2015-09-20 06:54:25      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

深度优先算法的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不能记录具体的路径值

深度优先算法DFS

标签:

原文地址:http://www.cnblogs.com/mingziday/p/4822761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!