zoukankan      html  css  js  c++  java
  • BFS迷宫问题模型(具体模拟过程见《啊哈算法》)

    题目描述与DFS模型走迷宫那篇一样。小哈被困在迷宫里,小哼解救小哈。

    这里用BFS来写。BFS(广搜)与DFS(深搜)的区别就在于,DFS是“不撞南墙不回头”,一条路走到不能再走之后才会回到起始点,另开辟一条新的道路;而BFS是将道路层层扩展,走到一个点时会同时搜索附近能到达的点,同时进行。

    这里先附上我最开始的代码(但编译出来是错的):

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    #include<math.h>
    #include<set>
    #include<map>
    using namespace std;
    struct node
    {
        int x,y,s;
    };
    int main()
    {
        struct node q[5000];
        int a[1005][1005]={0},book[1005][1005]={0};
        int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
        int i,j,n,m,p,q1,tx,ty,flag=0;
        int head,tail;  //队列
        scanf("%d%d",&n,&m);
        scanf("%d%d",&p,&q1);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        head=1;
        tail=1;
        q[head].x=1;
        q[head].y=1;
        q[head].s=0;
        tail++;
        book[1][1]=1;
        while(head<tail)
        {
            for(i=1;i<=3;i++)
            {
                tx=q[head].x+dir[i][0];
                ty=q[head].y+dir[i][1];
                if(tx>n||tx<1||ty>m||ty<1)
                    continue;
                if(a[tx][ty]==0&&book[tx][ty]==0)
                {
                    book[tx][ty]=1;
                    q[tail].x=tx;
                    q[tail].y=ty;
                    q[tail].s=q[head].s+1;
                    tail++;
                }
                if(tx==p&&ty==q1)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
                break;
            else
                head++;
        }
        printf("%d ",q[head-1].s);  //这个时候tail指向队列的末尾
        return 0;
    }

    一开始是不能输出,把最开始的那些变量定义在主函数前竟然就可以进行输入了(我也不知道为啥)。然后可以输入之后,我尝试了这组数据,但输出是0,还是错的:

    问了同学,她把我的输入输出格式给改了(cin  cout,但是我觉得这没什么影响呀);还有走四个方向的那个for循环,我 i  一开始从1开始,这样就只进行了三个方向的搜索,应该从i=0开始;最后是输出q[head].s,而不是head-1;最后正确代码如下:

    #include<stdio.h>
    #include<algorithm>
    #include<iostream>
    #include<string.h>
    #include<math.h>
    #include<set>
    #include<map>
    using namespace std;
    struct node
    {
        int x,y,s;
    } ;
    struct node q[5000];
    int a[1005][1005]= {0};
    int book[1005][1005]= {0}, dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
    int main()
    {
        int i,j,n,m,p,q1,tx,ty,flag=0;
        int head,tail;  //队列
        cin>>n>>m;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=m; j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        cin>>p>>q1;
        head=1;
        tail=1;
        q[head].x=1;
        q[head].y=1;
        q[head].s=0;
        tail++;
        book[1][1]=1;
        while(head<tail)
        {
            for(i=0; i<=3; i++)
            {
                tx=q[head].x+dir[i][0];
                ty=q[head].y+dir[i][1];
                if(tx>n||tx<1||ty>m||ty<1)
                    continue;
                if(a[tx][ty]==0&&book[tx][ty]==0)
                {
                    book[tx][ty]=1;
                    q[tail].x=tx;
                    q[tail].y=ty;
                    q[tail].s=q[head].s+1;
                    tail++;
                }
                if(tx==p&&ty==q1)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==1)
                break;
            else
                head++;
        }
        printf("%d ",q[head].s+1);  //这个时候tail指向队列的末尾
        return 0;
    }

  • 相关阅读:
    JAVA深入研究——Method的Invoke方法。
    java String->float,float->int
    Java中Object转化为int类型
    Android使用SeekBar
    转: 最值得阅读学习的 10 个 C 语言开源项目代码
    Eclipse快捷键列表大全
    Android使用的Eclipse NDK开发较详细一篇文章
    rm 删除带空格的文件或者目录
    man命令中的文本操作
    androidSDK无法更新的解决方法之一
  • 原文地址:https://www.cnblogs.com/programming123/p/10833757.html
Copyright © 2011-2022 走看看