初探队与广度优先搜索
http://www.mydrs.org  2002-6-25  大榕树

一、 队

  1、队的定义:
  队是特殊的线性表之一,它只允许在队的一端插入,在队的另一端删除。插入一端叫队尾(T),删除一端叫队首(H),没有任何元素的队叫做空队。队列遵循"先进先出"原则,排队购物、买票等,就是最常见的队。
         

  2、队的基本操作:

  (1)队的描述:
    type queue=array[1..100] of integer;
    var a:queue;    {定义数组}
      h,d:integer;  {队首、队尾指针}

  (2) 初始化(图1):
    procedure start;
     begin
      h:=1; d:=1;
     end;

  (3) 入队操作(图2):
     procedure enter;
      begin
       read(s); {读入数据}
       inc(d); {队尾加一}
       a[d]:=s;
      end;

  (4) 出队操作(图3):
     procedure out;
      begin
        inc(h); {队首加一}
       a[h]:=0;
      end;

二、 广度优先搜索
  广度优先搜索类似于树的按层次遍历的过程。它和队有很多相似之处,运用了队的许多思想,其实就是对队的深入一步研究,它的基本操作和队列几乎一样。

三、 队和广度优先搜索的运用
  图4表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。
   
                  图4

  分析:看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图5。

      
                  图5

  首先想到的是用队的思想。我们可以a记录搜索过程,a.city记录经过的城市,a.pre记录前趋元素,这样就可以倒推出最短线路。具体过程如下:

  (1) 将城市A入队,队首、队尾都为1。
  (2) 将队首所指的城市所有可直通的城市入队(如果这个城市在队中出现过就不入队,可用一个集合来判断),将入队城市的pre指向队首的位置。然后将队首加1,得到新的队首城市。重复以上步骤,直到城市H入队为止。当搜到城市H时,搜索结束。利用pre可倒推出最少城市线路。
  以下为参考程序:

  const ju:array[1..8,1..8] of 0..1=((1,0,0,0,1,0,1,1),
                     (0,1,1,1,1,0,1,1),
                     (0,1,1,0,0,1,1,1),
                     (0,1,0,1,1,1,0,1),
                     (1,1,0,1,1,1,0,0),
                     (0,0,1,1,1,1,1,0),
                     (1,1,1,0,0,1,1,0),
                     (1,1,1,1,0,0,0,1));
  type r=record {记录定义}
      city:array[1..100] of char;
      pre:array[1..100] of integer;
     end;
  var h,d,i:integer;
    a:r;
    s:set of 'A'..'H';
  procedure out; {输出过程}
  begin
   write(a.city[d]);
    repeat
     d:=a.pre[d];
     write('--',a.city[d]);
    until a.pre[d]=0;
   writeln;
   halt;
  end;
  procedure doit;
  begin
   h:=0; d:=1;
   a.city[1]:='A';
   a.pre[1]:=0;
   s:=['A'];
   repeat {步骤2}
    inc(h); {队首加一,出队}
    for i:=1 to 8 do {搜索可直通的城市}
     if (ju[ord(a.city[h])-64,i]=0)and
      (not(chr(i+64) in s))then {判断城市是否走过}
       begin
        inc(d); {队尾加一,入队}
    
       a.city[d]:=chr(64+i);
       a.pre[d]:=h;
       s:=s+[a.city[d]];
       if a.city[d]='H' then out;
      end;
   until h=d;
  end;
  begin {主程序}
   doit;
  end.

  输出:
   H-F--A

初探队与广度优先搜索相关推荐

  1. 算法初探系列4 - 广度优先搜索之图上搜索

    概述 广度优先搜索,又称宽度优先搜索,简称bfs. 与dfs不同的是,bfs是从根节点开始,先搜索较近的点再搜索较远的点,就像水波扩散一样. 如上图. 此图的dfs序为:A - B - E - F - ...

  2. 算法初探系列5 - 广度优先搜索之状态表示

    概述 上节课我们学习了在简单迷宫问题中如何使用BFS求解,这次我们来讲解一下较复杂 ~~(花里胡哨)~~ 的迷宫问题 复习+延伸(多起点BFS) 在普通bfs问题中,我们先将起点入队,然后一直从起点延 ...

  3. 深度优先搜索和广度优先搜索的比较与分析

    一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生 ...

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

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

  5. matlab bfs函数,matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)

    如此经典的算法竟一直没有单独的实现过,真是遗憾啊. 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过. 这次单独的将两个算法实现出来,因 ...

  6. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  7. 【洛谷】马的遍历--广度优先搜索(BFS)

    题目描述 传送门:https://www.luogu.com.cn/problem/P1443 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意 ...

  8. 广度优先搜索_广度优先搜索(BFS)

    广度优先搜索(breadth-first search)可用于"图"这种数据结构中,查找最短路径. 树是一种特殊的图,二叉树是一种特殊的树.广度优先搜索常用于遍历二叉树,在这个遍历 ...

  9. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

最新文章

  1. java链式编程_Java 中的链式编程
  2. sharepoint 2010 使用WinForm获取 SPSite对象
  3. php 声波图,Canvas 美丽的声波图
  4. 今天聊聊Oracle Database 21c 十“小”新特性
  5. python退出帮助系统_Python基础(09):帮助
  6. php.ini设置详解
  7. 使用dmidecode获取常用的硬件信息
  8. 将AD原理图文件和PCB文件转换为KiCad格式的方法
  9. JDBC连接数据库问题之jdk1.9以及jdk10以后版本的ext问题(添加扩展包问题)
  10. php webp格式转换,webp的格式的转换
  11. 《Dreamweaver CS6 完全自学教程》笔记 第十四章:使用 CSS 设计网页
  12. 泰山众筹如何实现用户主动裂变?
  13. 【图像处理 直方图 OpenCV实现】
  14. 上古卷轴3晨风职业_上古卷轴3晨风
  15. 2018年中国游戏行业发展现状及发展前景分析
  16. 数据分析、数据挖掘、数据运营有啥区别?
  17. 解决移动硬盘不能弹出问题
  18. numpy.random.rand(),numpy.random.randn(),numpy.random.normal()函数介绍和示例
  19. do vis是什么意思_BBC听力: 2020年2月8日 小宠物为什么可以找到回家的路
  20. 快速傅氏变换之旅(五) 嵌入式中的FFT(最好选择DSP或FPGA)

热门文章

  1. tipask mysql调取dedecms_如何实现dedecms外部数据库调用
  2. 数字IC后端设计实现流程之initial design
  3. 让别人查看云服务器的文件夹,让别人查看云服务器的文件夹
  4. 可口可乐造型设计_可口可乐推出黑科技音响,还能当冰箱用?
  5. ar nm ldd 静态库 动态库
  6. 对于一些敏感的数据(例如密码),为什么使用字符数组存储比使用String更安全?
  7. 【Vegas2006】8月24日-花豆擀面做法
  8. 转:解决vs2015生成软件在XP中运行时提示“不是有效的WIN32应用程序”
  9. 更改shape文件字段名,提示Failed to alter the name of the field
  10. SpringCloudAlibaba--Seata简单案例