關於佇列(還有廣度優先搜尋的例題)

2022-04-12 02:44:43 字數 3279 閱讀 7111

本博文的目錄:

$1 佇列

$2 佇列的例題

$3 廣度優先搜尋的例題

$1 佇列:

•佇列是什麼?

佇列是一種特殊的線性表,與棧不同,這種線性表只允許在表的前端(我們稱為front或head)進行刪除操作,在表的後端(我們稱作rear或tail)進行插入操作。所以又叫f(first)i(in)f(first)o(out)表。(對於棧來說,因為棧只允許在表的後端進行刪除操作,所以叫做l(last)i(in)f(first)o(out)表)

•在佇列裡的元素設定:
tail / rear:表示隊尾指標,應該指向隊尾元素的所在位置

head / front :表示隊頭指標,應指向隊頭元素的前乙個位置

•入隊演算法:

1     intq[maxn];

2 inthead,tail;

3 intn;

4 head=0;//當前佇列的頭指標

5 tail=1;//當前佇列的為指標

6 cin>>n;

7 q[tail]=n;//在當前尾指標處存上n的值

8 tail++;//將尾指標加一

•出隊演算法:

1     intq[maxn];

2 int head=0,tail=5;//假設隊中有5個元素

3 cout

•迴圈佇列:

(1)迴圈佇列是啥?

當尾指標指向陣列的最後乙個元素時,陣列將不能再繼續儲存,我們叫做「溢位」。但當佇列的指標指向最後乙個元素時,不一定是溢位了,因為對頭指標不一定是0。若隊頭指標不為0,但隊尾指標指向佇列的最後乙個元素時,這個佇列理論上是不能繼續存資料的,但是為佇列所開的陣列確實有空間,我們稱之為「假溢位」。如果不對佇列進行迴圈處理,就會造成對空間的極大浪費。這個時候,我們可以將整個佇列看成是乙個環,環上的元素就是佇列的元素,佇列的第maxn項後面為佇列的第1項,這樣就可以進行迴圈陣列的使用啦!

(2)**實現:

1     intq[maxn];

2 inttail,head;

3 intn;

4 cin>>n;

5 q[tail%maxn]=n;//maxn表示q陣列(佇列)的長度

6 tail=(tail+1)%maxn;

這只是乙個模板,具體的使用方法視情況而定);

$2 佇列的例題

•例--週末舞會:

【題目描述】

假設在週末舞會上,男士們和女士們進入舞廳時,各自排成一隊。跳舞開始時,依次從男隊和女隊的隊頭上各出一人配成舞伴。規定每個舞曲能有一對跳舞者。若兩隊初始人數不相同,則較長的那一隊中未配對者等待下一輪舞曲。現要求寫乙個程式,模擬上述舞伴配對問題。

【輸入】

第一行兩隊的人數;

第二行舞曲的數目。

【輸出】

配對情況。

【輸入樣例】

4 6

7

【輸出樣例】

1 12 2

3 34 4

1 52 6

3 1

直接上**:

1 #include2 #include3 #include4 #define maxn 1000010

5 using namespacestd;

6 inthead,tailw,tailm;//將兩個佇列看成乙個,頭指標是一樣的,而尾指標則根據男女的人數決定;

7 intman[maxn],woman[maxn];//將所有男人的編號和所有女人的編號分別存到man和woman佇列裡;

8 intmen,women,m;//men、women代表男人和女人的總數量;

9 intmain()

15 for(int i = 0;i < women;++i)

18 head = 0;

19 tailw = women; tailm =men;

20 while(head 25 return 0;

26 }//簡單易懂qaq

$3 廣度優先搜尋的例題

•例--連通塊:

【題目描述】

乙個n * m的方格圖,一些格仔被塗成了黑色,在方格圖中被標為1,白色格仔標為0。問有多少個四連通的黑色格仔連通塊。四連通的黑色格仔連通塊指的是一片由黑色格仔組成的區域,其中的每個黑色格仔能通過四連通的走法(上下左右),只走黑色格仔,到達該聯通塊中的其它黑色格仔。

【輸入】

第一行兩個整數n,m(1≤n,m≤100),表示乙個n * m的方格圖。

接下來n行,每行m個整數,分別為0或1,表示這個格仔是黑色還是白色。

【輸出】

一行乙個整數ans,表示圖中有ans個黑色格仔連通塊。

【輸入樣例】

3 3

1 1 1

0 1 0

1 0 1

【輸出樣例】

3

1 #include2 #include3 #include4 #define maxn 110

5 using namespacestd;

6 const int flag[4][2] = ,,,};//設了乙個陣列,表示在(i,j)的情況下向4個方向搜尋

7 int a[maxn][maxn],queue[maxn * maxn][2];//queue中存的是搜尋到的聯通塊的橫縱座標

8 intn,m,ans;

9 boolp[maxn][maxn];

10 11 void bfs(int x,inty)

26 }

27 }

28 29 intmain()

38 cout39 return 0;

40 }

//本題的思路:搜尋為1的元素-->如果為1,將聯通塊的附近搜尋-->將搜過的元素標為0-->搞定!

雙端佇列廣度優先搜尋

在乙個邊權只有0 1的無向圖中搜尋最短路徑可以使用雙端佇列進行bfs。其原理是當前可以擴充套件到的點的權重為0時,將其加入隊首 權重為1時,將其加入隊尾。達達是來自異世界的魔女,她在漫無目的地四處漂流的時候,遇到了善良的少女翰翰,從而被收留在地球上。翰翰的家裡有一輛飛行車。有一天飛行車的電路板突然出...

廣度優先搜尋演算法 例題maze

time limit 1 sec memory limit 128 mb submit 158 solved 39 submit status web board 500年前,jesse是我國最卓越的劍客。他英俊瀟灑,而且機智過人 突然有一天,jesse心愛的公主被魔王抓走,並困在了乙個巨大的迷宮中...

迷宮問題 模擬佇列 廣度優先搜尋

description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。input 乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。output 左上角到右下角的最短路...