队列的应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
then
begin inc(closed);{进队列}
h[closed,1]:=x;h[closed,2]:=y; pic[x,y]:=0;{打删除标志} end;{为细胞的入队}
end;
end;
begin fillchar(pic,sizeof(pic),0); num:=0; fillchar(h,sizeof(h),0); assign(input,'a.in');reset(input); assign(output,'a.out');rewrite(output); readln(m,n); for i:=1 to m do begin readln(s); for j:=1 to n do if s[j]='0' then pic[i,j]:=0 else pic[i,j]:=1; end; for i:=1 to m do for j:=1 to n do if pic[i,j]=1 then doing(i,j);{在矩阵中寻找细胞} writeln(num); close(input); close(output);
非空:open<closed
7……
我们按照如下方式定义队列: Const m=队列元素的上限; Var q :array[1…m] of integer; open,closed:integer;
{定义队列} {队尾指针和队首指针}
2、队列的基本运算 队 列 的 运 算 主 要 有 两 种 : 入 队 ( ADD ) 和 出 队 (DEL) 1、过程ADD(x)—在队列q的尾端插入元素x
注意:实际操作,可以不使用过程!
例: 一矩形阵列由数字0到9组成,数字1到9代表细胞,
细胞的定义为沿细胞数字上下左右还是细胞数字则为同 一细胞,求给定矩形阵列的细胞个数。
输入:整数m,n(m行,n列)
矩阵
输出:细胞的个数。
样例:
输入:
4 10 0234500067 1034560500 2045600671 0000000089
procedure ADD( x:qtyper); begin
{后移队尾指针并插入元素x} closed:=closed+1; q[closed]←x; end;{ADD}
注意:实际操作,可以不使用过程!
2、函数DEL—取出q队列的队首元素 function DEL; begin open:=open+1; del:=q[open]; end;{DEL}
队列(FIFO)
1 队列的定义
所谓队列,就是允许在一端进行插入,在另一端进行删除的线性表。 允许插入的一端称为队尾。规则:先进先出! 初始化一般头:open=0;尾:closed=0;
队列头 open
队列尾 closed
3265419
队列数组a下标: 01 234 56 当 open>=closed时,队列空
end.
广度优先搜索 BFS
在深度优先搜索算法中,是深度越大的结点越 先得到扩展。如果在搜索中把算法改为按结点的层 次进行搜索, 本层的结点没有搜索处理完时,不能 对下层结点进行处理,即深度越小的结点越先得到 扩展, 也就是说先产生 的结点先得以扩展处理,这 种搜索算法称为广度优先搜索法。英语中用 Breadth-First-Search表示,所以我们也把广度优先搜 索法简称为BFS。
广度优先搜索的基本思想
从图中某一顶点Vo出发,
首先访问Vo相邻的所有未被访
问过的顶点V1、V2、……Vt;
深度
再依次访问与V1、V2、……Vt
__V1__
1
相邻的且未被访问过的所有顶 /
\
点。如此继续,直到访问完图 V2 V3
2
中所有的顶点。如果用广度优 先法对下图中结点进行搜索,
/\
/\
V4 V5 V6 V7
输出:4
0234500067 1034560500 2045600671 0000000089
共4个细胞
算法步骤: 1、从文件中读入m*n矩阵,将其转换为0、1矩阵存入pic
数组中; 2、wenku.baidu.compic数组矩阵从上到下,从左到右,找到遇到的第
一个细胞;将细胞的位置入队h,并沿其上、下、左、右 四个方向上搜索,如果遇到细胞(pic[I,j]=1)则将其位置入队, 入队后的位置pic[I,j]数组置为0;
3、将h队的队头出队,沿其上、下、左、右四个方向上 搜索,如果遇到细胞则将其位置入队,入队后的位置pic数 组置为0;
4、重复3,直至h队空为止,则此时找出了一个细胞; 5、重复2,直至矩阵找不到细胞; 6、输出找到的细胞数。
const dx:array[1..4] of -1..1=(-1,0,1,0);
/\
3
从结点V1出发,先搜索处理它
V8 V9
4
的子结点V2和V3,即深度为2
的结点;然后搜索深度为3的子
结 点 V4 、 V5 、 V6 、 V7 ; 最 后
搜索深度为 4 的结点V8和V9。
整个搜索的次序与结点产生的
begin
inc(open); for k:=1 to 4 do {沿细胞的上下左右四个方向搜索细胞}
begin x:=h[open,1]+dx[k]; y:=h[open,2]+dy[k]; {进入位置(x,y)} if (x>0) and (x<=m) and (y>0) and (y<=n) and (pic[x,y]=1) {(x,y)处有细胞}
procedure doing(i,j:integer);
var k,open,closed,x,y:integer;
begin
inc(num); pic[i,j]:=0; open:=0; {队列头} closed:=1; {队列尾} h[1,1]:=i; h[1,2]:=j;{遇到的第一个细胞入队} while open<closed do {队不空}
dy:array[1..4] of -1..1=(0,1,0,-1);
var
s:string; pic:array[1..50,1..80] of 0..1; {0:无细胞;1:有细胞}
m,n,i,j,num:integer; h:array[1..4000,1..2] of byte; {队列:存细胞的坐标, 1:行;2:列}
相关文档
最新文档