初探隊與廣度優先搜索

作 者:張中亮

一、 隊

  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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章