作 者:張中亮
一、 隊
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