zoukankan      html  css  js  c++  java
  • DFS和BFS的理解与学习+模板

    DFS :深度优先遍历。

    BFS :广度优先遍历。

    DFS 的算法演示动画 :http://sjjg.js.zwu.edu.cn/SFXX/sf1/sdyxbl.html

    BFS 的算法演示动画 :http://sjjg.js.zwu.edu.cn/SFXX/sf1/gdyxbl.html

    知道 DFS&BFS的基本原理  之后 我们再看几道例题。

                                             例一 :    找女朋友

            题目描述 :

            X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。

    为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。
            输入  :
           多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。
           输出 :
           若X可以到达Y的家,输出最少时间,否则输出 -1。
           示例输入
            3 3
           X#Y
           ***
           #*#
            3 3
           X#Y
           *#*
           #*#     
          示例输出

           4

           -1

    DFS 代码如下 :

    #include<stdio.h>
    #include<string.h>
    int mv[16][16];
    char map[16][16];
    int mx[4]={-1,0,1,0};
    int my[4]={0,-1,0,1};
    int min;
    struct B
    {
        int x,y,ans;
    };
    /*DFS开始*/
    void dfs(int x,int y,int n,int m,int ans)
    {
        int i;
        if(ans>=min)
            return ;
        if(ans<min&&map[x][y]=='Y'){
            min=ans;
            return ;
        }
        struct B t;
        for(i=0;i<4;i++)
        {
            t.x=x+mx[i];
            t.y=y+my[i];
            if(0<=t.x&&t.x<n&&0<=t.y&&t.y<m&&mv[t.x][t.y]==0&&map[t.x][t.y]!='#'){
                mv[t.x][t.y]=1;
                dfs(t.x,t.y,n,m,ans+1);
                mv[t.x][t.y]=0;
            }
        }
    }
    int main()
    {
        int i,j,n,m;
        while(~scanf("%d %d",&n,&m)){
            for(i=0;i<n;i++)
                scanf("%s",map[i]);
            memset(mv,0,sizeof(mv));
            min=300;
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                    if(map[i][j]=='X')
                    break;
                if(j!=m)break;
            }
            dfs(i,j,n,m,0);
            min==300?printf("-1
    "):printf("%d
    ",min);
        }
        return 0;
    }

    BFS  代码如下 :

    #include<stdio.h>
    #include<string.h>
    int mv[16][16];
    char map[16][16];
    int mx[4]={-1,0,1,0};
    int my[4]={0,-1,0,1};
    struct B
    {
        int x,y,ans;
    }q[300],t,f;
    int main()
    {
        int i,j,n,m,flag,s,e;
        while(~scanf("%d %d",&n,&m)){
            for(i=0;i<n;i++)
                scanf("%s",map[i]);
            memset(mv,0,sizeof(mv));
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                    if(map[i][j]=='X')
                    break;
                if(j!=m)break;
            }//BFS开始
            s=flag=e=0;
            t.x=i,t.y=j,t.ans=0;
            q[e++]=t;//进栈
            mv[t.x][t.y]=1;
            while(s<e){
                t=q[s++];//出栈
                if(map[t.x][t.y]=='Y'){
                    printf("%d
    ",t.ans);
                    flag=1;
                    break;
                }
                for(i=0;i<4;i++)
                {
                    f.x=t.x+mx[i];
                    f.y=t.y+my[i];
                    if(0<=f.x&&f.x<n&&0<=f.y&&f.y<m&&mv[f.x][f.y]==0&&map[f.x][f.y]!='#'){
                        f.ans=t.ans+1;
                        q[e++]=f;
                        mv[f.x][f.y]=1;
                    }
                }
            }
            if(flag==0)printf("-1
    ");
        }
        return 0;
    }


    作者:blueppo
    出处:http://www.cnblogs.com/Yan-C/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    mysql 历史版本下载
    mysql 5.7 版本 You must reset your password using ALTER USER statement before executing this statement报错处理
    5.7 zip 版本的安装 以及遇到的坑
    mysql 5.6zip版本的卸载与5.7 zip 版本的安装
    mysql数据库的备份与还原
    本地Navicat连接docker里的mysql
    docker修改数据库密码
    docker 在push镜像到本地registry出现的500 Internal Server Error
    linux 没有界面内容显示不全解决办法
    json与map互相转换
  • 原文地址:https://www.cnblogs.com/Yan-C/p/3550625.html
Copyright © 2011-2022 走看看