/*层层递进-广度优先搜索*/

#include "stdio.h"
struct note
{
    int x;//横坐标
    int y;//纵坐标
    int f;//父亲在队列中的编号,本题不要求输出路径,可以不需要f
    int s;//步数
};

int main()
{
    struct note que[2501];//因为地图大小不超过50*50,因此队列扩展不会超过2500个

int a[51][51] = {0},book[51][51] = {0};
    //定义一个用于表示走的方向的数组
    int next[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};//分别表示向右,向下,向左,向上
    int head,tail;
    int i,j,k,n,m,startx,starty,p,q,tx,ty,flag;

scanf("%d %d",&n,&m);
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d %d %d %d",&startx,&starty,&p,&q);

//队列初始化
    head = 1;
    tail = 1;
    //往队列插入迷宫坐标
    que[tail].x = startx;
    que[tail].y = starty;
    que[tail].f = 0;
    que[tail].s = 0;
    tail++;
    book[startx][starty] = 1;

flag = 0;//用来标记是否到达目标点,0表示暂时没有到达,1表示到达
    //当队列不为空时循环
    while(head < tail)
    {
        //枚举4个方向
        for(k = 0;k <= 3;k++)
        {
            //计算下一个点的坐标
            tx = que[head].x + next[k][0];
            ty = que[head].y + next[k][1];
            //判断是否越界
            if(tx < 1 || tx > n || ty < 1 || ty > m)
            {
                continue;//跳出此次循环
            }
            //判断是否是障碍物或者已经在路径中
            if(a[tx][ty] == 0 && book[tx][ty] == 0)
            {
                //把这个点标记为已经走过
                //注意宽搜每个点只入队列一次,所以和深搜不同,不用将book数组还原
                book[tx][ty] = 1;
                //插入新的点到队列之中
                que[tail].x = tx;
                que[tail].y = ty;
                que[tail].f = head;//因为这个点是从head扩展出来的,所以他的父亲就是head,本题目不需要求路径,因此本句可省略
                que[tail].s = que[head].s + 1;//步数是父亲的步数加1
                tail++;
            }
            //如果到目标点了,停止扩展,任务结束,退出循环
            if(tx == p && ty == q)
            {
                //注意下面两句话千万不要写颠倒了
                flag = 1;
                break;
            }
        }
        if(flag == 1)
        {
            break;
        }
        head++;//全部出列,注意这地方千万不要忘记,当一个点扩展结束后,head++才能对后面的点再进行扩展
    }
    //打印队列中末尾最后一个点(目标点)的步数
    //注意tail指向的是队列队尾(即最后一为)的下一个位置,所以这里需要-1
    printf("%d\n",que[tail - 1].s );
    getchar();getchar();
    return 0;
}
/*********
示例输入:
5 4
0 0 1 0
0 0 0 0 
0 0 1 0
0 1 0 0 
0 0 0 1
1 1 4 3
示例输出:
7
************/

第4章第3节-层层递进-广度优先搜索相关推荐

  1. 算法简介:层层递进----广度优先搜索(BFS)

    算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...

  2. 层层递进-广度优先搜索

    从题目可以看出,广度优先搜索是一层一层的搜索,而深搜是一根筋,一直搜到底O(∩_∩)O哈哈~. 到底怎么实现广搜呢?深搜是递归,想必大家可能恨死递归了.广搜不用递归,就用循环和队列就够! 这个题目,从 ...

  3. [C] 层层递进——C语言实现广度优先搜索

    以防万一有人想不开要做染色的题呢?比如我. 广度优先搜索 如何实现一个广度优先搜索 广搜(bfs)是一个层层递进的概念,与深搜的不撞南墙不回头不同,广搜更像一个感染的过程,一个点只能感染到它周边的点. ...

  4. C++两个函数可以相互递归吗_[算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  5. [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进

    [算法系列] 搞懂递归, 看这篇就够了 !! 递归设计思路 + 经典例题层层递进 从学习写代码伊始, 总有个坎不好迈过去, 那就是遇上一些有关递归的东西时, 看着简短的代码, 怎么稀里糊涂就出来了. ...

  6. 《UML面向对象设计基础》—第1章1.2节信息/实现隐藏

    本节书摘来自异步社区<UML面向对象设计基础>一书中的第1章1.2节信息/实现隐藏,作者[美]Meliir Page-Jones,更多章节内容可以访问云栖社区"异步社区" ...

  7. 《敏捷迭代开发:管理者指南》—第2章2.5节渐进开发和自适应开发

    本节书摘来自异步社区<敏捷迭代开发:管理者指南>一书中的第2章2.5节渐进开发和自适应开发,作者[美]Craig Larman,更多章节内容可以访问云栖社区"异步社区" ...

  8. 《实现模式(修订版)》—第1章1.2节那么,现在……

    本节书摘来自异步社区<实现模式(修订版)>一书中的第1章1.2节那么,现在--,作者[美]Kent Beck,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1. ...

  9. 《Adobe Acrobat DC经典教程》—第1章1.11节在阅读模式下查看PDF文件

    本节书摘来自异步社区<Adobe Acrobat DC经典教程>一书中的第1章1.11节在阅读模式下查看PDF文件,作者[美]Lisa Fridsma(丽莎 弗里斯玛) , Brie Gy ...

最新文章

  1. [翻译完成] Pi+Raspbian+CGMiner+TightVNC+WIFI五合一矿机超级教程
  2. 人工智能(Artificial Intelligence)常用算法
  3. 前方高能 | 容器化应用操作原来可以这样简单
  4. js常用事件整理—兼容所有浏览器
  5. WxWidgets :一些古怪的源代码
  6. php函数删除非空目录,删除文件夹(非空目录)及其中所有文件的思路及源代码
  7. pytorch教程龙曲良26-30
  8. 【OJ】洛谷字符串题单题解锦集
  9. 玩转华为云开发|老板万万没想到:刚入职的我一人就搞定人脸识别开发
  10. 充电枪cp信号控制板_新能源汽车充电头气密性检测是怎么做的呢?
  11. CISCO3560 VLAN配置实例
  12. 查找算法之四 斐波那契查找(C++版本)
  13. ultilize什么意思_utilize是什么意思_utilize在线翻译_读音_用法_例句_含义-查字典网...
  14. archlinux 分区
  15. Element UI 的日历控件,并在日期中做标注
  16. 二极管的三种击穿形式
  17. C1认证学习十四、十五(算法常识、HTML Head 头)
  18. 正负数排列(用链表和数组实现)
  19. 计算机三级网络技术分值占比,全国计算机等级考试三级考试题型及分值比例
  20. 浙江大学软件学院2020年保研上机模拟练习

热门文章

  1. 【专业选择】想选择 IT 相关专业?那么就要先详细了解 IT 行业!
  2. CAD二次开发--如何获取图面“组”对象及其内部实体(以南方CASS居民地-房屋为例)
  3. 【23招实用技巧让XP运行更快捷更可靠】
  4. 乐山持点电商:抖音商家群聊群直播通知使用指南
  5. 每日五题-202202
  6. 苹果a13_iPhone11大降800元,苹果A13+256GB,库克还是清仓了
  7. 12事务与并发控制(数据库原理)
  8. 基于巨杉数据库的银行流水查询系统
  9. 去除面部黑色素小妙招_如何去脸上色素斑小妙招?教你快速祛除色斑沉着的方法...
  10. 巧记口诀确定正方体表面展开图