本博文的目錄:
$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 67
【輸出樣例】
1 12 2
3 34 4
1 52 6
3 1
1 #include2 #include3 #include4 #define maxn 10000105 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 31 1 1
0 1 0
1 0 1
【輸出樣例】
3
1 #include2 #include3 #include4 #define maxn 1105 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 左上角到右下角的最短路...