zoukankan      html  css  js  c++  java
  • 九度 题目1335:闯迷宫 题目1365:贝多芬第九交响曲


    转载请注明本文地址http://blog.csdn.net/yangnanhai93/article/details/40718149


    简单说说宽度优先搜索BFS


    说实话,这是第一个自己写的宽度优先搜索的题目。之前也是不太明确之间的差别,好吧。仅仅能说自己学的太渣……


    言归正传,对于刚開始学习的人来说,可能最大的概念就是一个是深度搜索,一个是宽度搜索,好吧。我表示废话了,我事实上就是这个样子的,然后一直不得甚解。

    。。

    所以第一次上来。我就直接搜索DFS。结果太明显,就是TLE或者MLE,然后就抓狂中。这可能是非常多刚開始学习的人在開始的时候犯的错误了。


    我个人的感觉宽度搜索和深度搜索都是非常暴力的枚举,可是差别呢,还是比較明显的,就比方以下这两题来说,基本上的都是一样,通过题目的描写叙述,都是最快找到,在深度优先搜索中就是要找到全部能到达的最短路径了。所以。事实上应该说都可以找到的,仅仅是花费的时间不一样而已。


    总结起来就是下面几点:

    1:宽度优先搜索的用意一般都会比較明显。比方最小啊,就是有比較限制的时候,比較多的时候会用宽度优先,这个,能够用一个比喻来说,就是从一个点。滴墨水,看谁先到。这就是宽度,每做一步,墨水都会扩散。然后得到新的起始点,继续扩散,一个循环的过程。

    2:深度优先的话,用于枚举多少类型的时候会比較多,非经常见的应用就是8皇后。N皇后的问题了


    附上两题的题解

     题目1365:贝多芬第九交响曲

    题目链接地址http://ac.jobdu.com/problem.php?pid=1365


    #include <stdio.h>
    #include <queue>
    #include <memory.h>
    using namespace  std;
     
    struct Node
    {
        int x, y,step;
    };
    bool A[101][101];
    short testCase[8][2]={{-1,-2},{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2}};
    int Cal(int x,int y,int ex,int ey,int num)
    {
        if(x==ex&&y==ey)
            return 0 ;
        queue <Node> p;
        Node tmp,q;
        int result=0;
        tmp.x=x;
        tmp.y=y;
        tmp.step=0;
        p.push(tmp);
        while(p.size()>0)
        {
            tmp=p.front();
            p.pop();
            for (int i=0;i<8;i++)
            {
                q.x=tmp.x+testCase[i][0];
                q.y=tmp.y+testCase[i][1];
                if(q.x>0&&q.y<=num&&q.x<=num&&q.y>0&&!A[q.x][q.y])
                {
                    q.step=tmp.step+1;
                    A[q.x][q.y]=true;
                    if(q.x==ex&&q.y==ey)
                        return q.step;
                    else
                        p.push(q);
                }
            }
     
        }
        return -1;
    }
     
    int main()
    {
        int num,x,y,ex,ey;
        //freopen("data.in","r",stdin);
        while(scanf("%d",&num)!=EOF)
        {
            memset(A,0,sizeof(A));
            scanf("%d%d%d%d",&x,&y,&ex,&ey);
            printf("%d
    ",Cal(x,y,ex,ey,num));
        }
        return 0;
    }
    /**************************************************************
        Problem: 1365
        User: vincent_ynh
        Language: C++
        Result: Accepted
        Time:450 ms
        Memory:1064 kb
    ****************************************************************/


    九度 题目1335:闯迷宫

    题目链接地址:http://ac.jobdu.com/problem.php?pid=1335

    #include <stdio.h>
    #include <memory.h>
    #include <queue>
    using namespace std;
    //#define LOCAL
    bool A[100][100];
    struct Node
    {
        int x,y,step;
    };
     
    int Cal(int num)
    {
        if(num==1)
            return 0;
        Node first,second;
        first.x=0;
        first.y=0;
        first.step=0;
        int testCase[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
        queue<Node> result;
        result.push(first);
        while(result.size()>0)
        {
            first=result.front();
            A[first.x][first.y]=true;
            result.pop();
            for (int i=0;i<4;i++)
            {
                second.x=first.x+testCase[i][0];
                second.y=first.y+testCase[i][1];
                second.step=first.step+1;
                if(second.x>=0&&second.y<num&&second.x<num&&second.y>=0&&!A[second.x][second.y])
                {
                    A[second.x][second.y]=true;
                    if(second.x==num-1&&second.y==num-1)
                        return second.step;
                    else
                        result.push(second);
                }
                 
            }
        }
        return -1;
    }
    int main()
    {
        int inf=10000;
    #ifdef LOCAL
        freopen("data.in","r",stdin);
        freopen("data.out","w",stdout);
    #endif
        int num;
        while(scanf("%d",&num)!=EOF)
        {
            for(int i=0;i<num;i++)
                for(int j=0;j<num;j++)
                {
                    scanf("%d",&A[i][j]);
                }
            if(A[0][0]==false&&A[num-1][num-1]==false)
                printf("%d
    ",Cal(num));
            else
                printf("-1
    ");
        }
        return 0;
    }
    /**************************************************************
        Problem: 1335
        User: vincent_ynh
        Language: C++
        Result: Accepted
        Time:100 ms
        Memory:1064 kb
    ****************************************************************/


  • 相关阅读:
    Ubuntu 14.04 FTP服务器--vsftpd的安装和配置
    Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)
    Ubuntu Server14.04 32位安装odoo8.0简单方法
    js打印出对象的方法
    odoo中pos模块由于删除partner导致发生(你试图访问的单据已经删除)错误的解决方法
    django的安装和搭建
    mongodb入门
    js数组的操作
    mongodb的优缺点
    Spring动态切换多数据源解决方案
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5117764.html
Copyright © 2011-2022 走看看