zoukankan      html  css  js  c++  java
  • 深度优先搜索

    深度优先遍历的思想:从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念。 深度优先搜索可以用栈来实现,在栈中保存从起始结点,到当前结点路径上的所有结点,一般运用递归实现, 递归的基本思想:某个函数直接或间接地调用自身。递归的关键问题:1.找出递归公式。2、找出递归终止条件。 ]U6J7V2[_RQE)K9IAQWQA(2                     例题:走迷宫问题(深度优先搜索实现) 给定一个二维数组 int map[5][5] = { 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , } ; 它表示一个迷宫,其中“1”表示墙壁,“0”表示可以走的路,只能横着走或者竖着走,不能斜着走,要求编写程序求出从左上角到右下角的最短路径的长度,例如上述问题输出结果为:8 四个方向,每次选择一个方向走,不通时走下一个方向,如果四个方向都不能走时,则退一格。
    #include
    #include
    using namespace std ;
    struct dot  {
        int step ;
    }d[100][100];
    int m , n ;
    bool is_ok(int x , int y)   {
        if(x < 0 || x >= m || y < 0 || y >= n)
            return 0 ;
        return 1 ;
    }
    int dx[] = {0 , -1 , 0 , 1} ;
    int dy[] = {1 , 0 , -1 , 0} ;
    int vis[100][100] = {0} , map[100][100] ;
    bool flag = 0 ;
    void dfs(int x , int y) {
        if(x == 4 && y == 4)    {
            cout << d[x][y].step << endl ;
            flag = 1 ;
            return ;
        }
        for(int i = 0 ; i < 4 ; i++)    {
            int xx , yy ;
            xx = x + dx[i] ;
            yy = y + dy[i] ;
            if(!vis[xx][yy]&&map[xx][yy] != 1 &&is_ok(xx,yy)) {
                vis[xx][yy] = 1 ;
                d[xx][yy].step = d[x][y].step + 1 ;
                dfs(xx,yy) ;
                if(flag)
                    return ;
                vis[xx][yy] = 0 ;
            }
        }
    }
    int main()  {
        cin >> m >> n ;
        for(int i = 0 ; i < m ; i++)
            for(int j = 0 ; j < n ; j++)
                cin >> map[i][j] ;
        d[0][0].step = 0 ;
        dfs(0,0);
        return 0 ;
    }
    
    如果想输出所走路径,可以使用以下方法:
    #include
    #include
    #include
    using namespace std ;
    struct dot  {
        int x , y ;
        int step ;
    }d[100][100];
    int m , n ;
    bool is_ok(int x , int y)   {
        if(x < 0 || x >= m || y < 0 || y >= n)
            return 0 ;
        return 1 ;
    }
    int dx[] = {0 , -1 , 0 , 1} ;
    int dy[] = {1 , 0 , -1 , 0} ;
    int vis[100][100] = {0} , map[100][100] ;
    bool flag = 0 ;
    void dfs(int x , int y) {
        if(x == 4 && y == 4)    {
            cout << d[x][y].step << endl ;
            flag = 1 ;
            return ;
        }
        for(int i = 0 ; i < 4 ; i++)    {
            int xx , yy ;
            xx = x + dx[i] ;
            yy = y + dy[i] ;
            if(!vis[xx][yy]&&map[xx][yy] != 1 &&is_ok(xx,yy)) {
                vis[xx][yy] = 1 ;
                d[xx][yy].x = x ;
                d[xx][yy].y = y ;
                d[xx][yy].step = d[x][y].step + 1 ;
                dfs(xx,yy) ;
                if(flag)
                    return ;
                d[xx][yy].x = -1 ;
                d[xx][yy].y = -1 ;
                vis[xx][yy] = 0 ;
            }
        }
    }
    int main()  {
        cin >> m >> n ;
        for(int i = 0 ; i < m ; i++)
            for(int j = 0 ; j < n ; j++)
                cin >> map[i][j] ;
        memset(d,-1,sizeof(d)) ;
        d[0][0].step = 0 ;
        dfs(0,0);
        for(int i = 0 ; i < m ; i++)
            for(int j = 0 ; j < n ; j++)
                if(d[i][j].x != -1)
                    cout << "(" << d[i][j].x << " , " << d[i][j].y << ")" << endl ;
        cout << "(4 , 4)" << endl ;
        return 0 ;
    }
    
    同样可以使用栈来实现深度优先搜索:
    #include
    #include
    #include
    #include
    using namespace std ;
    struct dot  {
        int x , y ;
        int step ;
    };
    int m , n ;
    stack s ;
    bool is_ok(int x , int y)   {
        if(x < 0 || x >= m || y < 0 || y >= n)
            return 0 ;
        return 1 ;
    }
    int dx[] = {1 , 0 , -1 , 0} ;
    int dy[] = {0 , -1 , 0 , 1} ;
    int vis[100][100] = {0} , map[100][100] ;
    
    void dfs() {
        while(!s.empty())   {
            dot cur = s.top() ;
            s.pop() ;
            if(cur.x == 4 && cur.y == 4)    {
                cout << cur.step << endl ;
                return ;
            }
            for(int i = 0 ; i < 4 ; i++)    {
                dot next ;
                next.x = cur.x + dx[i] ;
                next.y = cur.y + dy[i] ;
                if(!vis[next.x][next.y]&&map[next.x][next.y] != 1 &&is_ok(next.x,next.y)) {
                    vis[next.x][next.y] = 1 ;
                    next.step = cur.step + 1 ;
                    s.push(next) ;
                }
            }
        }
        return ;
    }
    int main()  {
        cin >> m >> n ;
        for(int i = 0 ; i < m ; i++)
            for(int j = 0 ; j < n ; j++)
                cin >> map[i][j] ;
        dot cur ;
        cur.x = 0 ;
        cur.y = 0 ;
        cur.step = 0 ;
        s.push(cur) ;
        dfs();
        return 0 ;
    }
    
  • 相关阅读:
    计算机网络【七】:可靠传输的实现 (tcp窗口滑动以及拥塞控制)【转】
    计算机网络【六】:传输层-TCP概述 【转】
    计算机网络【五】:路由选择协议 【转】
    计算机网络【三】:数据链路层 【转】
    计算机网络【二】:物理层【转】
    计算机网络【一】:概述 【转】
    装饰模式-Decorator
    Java中的文件上传和下载
    模板方法模式-TemplateMethod
    策略模式-Strategy
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4236852.html
Copyright © 2011-2022 走看看