题目描述与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\n",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\n",q[head].s+1);  //这个时候tail指向队列的末尾
    return 0;
}

转载于:https://www.cnblogs.com/programming123/p/10833757.html

BFS迷宫问题模型(具体模拟过程见《啊哈算法》)相关推荐

  1. bfs迷宫寻路问题(一看就懂的讲解)

    bfs迷宫问题讲解 广度优先搜索解决迷宫寻路问题 一.问题概述 二.问题分析 (一).手动模拟 (二).如何用计算机来解决 (1).地图表示 (2).如何找通路 (3).==如何找最短路(难点)== ...

  2. Biome-BGC生态系统模型区域模拟

    Biome-BGC是利用站点描述数据.气象数据和植被生理生态参数,模拟日尺度碳.水和氮通量的有效模型,其研究的空间尺度可以从点尺度扩展到陆地生态系统. 在Biome-BGC模型中,对于碳的生物量积累, ...

  3. Meta 分析在生态环境领域、Biome-BGC生态系统模型区域模拟

    Meta 分析( Meta Analysis)是当今比较流行的综合具有同一主题的多个独立研究的统计学方法, 是较高一级逻辑形式上的定量文献综述.20 世纪 90 年代后,Meta 分析被引入生态环境领 ...

  4. 问题 E: 古希腊之争(一)(bfs迷宫裸模板)

    时间限制: 1 Sec  内存限制: 128 MB 提交: 138  解决: 52 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 伯罗奔尼撒战争是以雅典为首的提洛同盟与以斯巴达为首的 ...

  5. 在lammps模拟过程中的常用势函数设置

    文章目录 1 lj/cut 1.1 lj/cut在in文件中使用方法 1.2 lj/cut在data文件中使用方法 1.3 lj/cut参数查询方法 1.4 lj/cut参数单位转换方法 1.5 lj ...

  6. 调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优。

    调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优.  个人理解

  7. Socket编程(C语言实现)—— AF_INET(典型的TCP/IP四层模型的通信过程),AF_UNIX(本地进程间通信)

    1.AF_INET域与Socket通信 其是典型的TCP/IP四层模型的通信过程. (1)接收方与发送方依赖IP和port来标识,即,将本地socket绑定到对应的IP端口上: (2)发送数据时指定对 ...

  8. 约瑟夫环问题(vector模拟过程)

    1862: zbj的狼人杀 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 这天zbj和小 ...

  9. 网络基础2(分层模型,通信过程,以太网,ARP协议格式和具体功能详解)

    分层模型 OSI七层模型 OSI模型 1 物理层:主要定义物理设备标准,如网线的接口类型.光纤的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达 ...

最新文章

  1. OpenCASCADE:常用Inspector控件之树视图
  2. C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数
  3. 前端学习(3332):ant design介绍button
  4. c语言mergesort 参数,归并排序C语言兑现MergeSort
  5. Linux内核信号量:二值信号量/互斥信号量,计数信号量,读写信号量
  6. 6.2神经网络算法应用上学习笔记
  7. discuz二开的9月最新版本Miko二次元动漫视频网站源码完美搭建视频php源码
  8. idea中字体由繁体变简体
  9. 代码审查工具 rietveld的安装与使用(二)
  10. 达梦7数据库单机安装(命令行方式)
  11. 抖音视频选择封面android,抖音视频封面怎么选取?
  12. SSH之known_hosts文件
  13. FDTD Solutions-PML
  14. android ui 切图工具,APP切图标注教程:UI设计切图标注的小工具实用技巧
  15. 游戏数学: 计算屏幕点中的平面上的点(上帝视角)
  16. Cache entry deserialization failed, entry ignored 错误解决
  17. 【Vue element-admin 如何给侧边栏添加 Badge 计数标记 】
  18. Nginx服务器安装
  19. 海南实现旅游总收入1.06亿元人民币
  20. 02 创建一个简单的Python Web程序应用

热门文章

  1. Linux 命令之 userdel -- 用于删除给定的用户以及与用户相关的文件
  2. Linux 查看数据库MySQL安装文件和安装目录的命令
  3. html 完全复制div中的内容_LOL手游现在远非完全体,未来还有哪些端游内容会加入手游中?...
  4. 快速排序 自带时间复杂度检测
  5. 华为p6电信版 android 4.5,华为P6电信版系统应用apk补全教程 完整EMUI
  6. python的智能算法_scikit-opt——Python中的群体智能优化算法库
  7. C语言实例:3个数从小到大排序
  8. python 元类 type_Python 使用元类type创建类对象常见应用详解
  9. C++中 Vector使用方法
  10. 工业POE交换机使用中的常见问题汇总