宽度优先搜索算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
广度优先搜索
广度优先搜索
广度优先搜索类似于树的按层次遍历的过程。它和队有很多相似之处,运用了队的许多思想,其实就是对队的深入一步研究,它的基本操作和队列几乎一样。
三、队和广度优先搜索的运用
图4表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。
图4
分析:看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图5。
图5
首先想到的是用队的思想。我们可以a记录搜索过程,a.city记录经过的城市,a.pre记录前趋元素,这样就可以倒推出最短线路。具体过程如
下:
(1)将城市A入队,队首0、队尾都为1。
(2)将队首所指的城市所有可直通的城市入队(如果这个城市在队中
出现过就不入队,可用一个集合来判断),将入队城市的pre指向队首的位置。然后将队首加1,得到新的队首城市。重复以上步骤,直到城市H入队为止。当搜到城市H时,搜索结束。利用pre可倒推出最少城市线路。
以下为参考程序:
const ju:array[1..8,1..8] of integer=((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;
writeln()
end;
begin {主程序}
doit;
end.
输出:
H-F--A