佇列及其應用 取牌遊戲

2021-10-24 23:24:28 字數 2691 閱讀 4870

一:基本概念

佇列是一種操作受到限制的特殊線性表。其插入操作限定在表的一端進行,稱為「入隊」;其刪除操作則限定在表的另一端進行,稱為「出隊」。插入一端稱為隊尾(rear);刪除一端稱為隊頭(front)。

佇列也被稱作「先進先出」線性表(fifo,first in first out)。類似於生活中排隊購票,先來先買,後來後買。

在不斷入隊、出隊的過程中,佇列將會呈現出以下幾種狀態:

隊空:佇列中沒有任何元素。

隊滿:佇列空間已全被占用。

溢位:當佇列已滿,卻還有元素要入隊,就會出現「上溢(overflow)」;當佇列已空,卻還要做「出隊」操作,就會出現「下溢(underflow)」。兩種情況合在一起稱為佇列的「溢位」。

二:佇列的基本操作

(1)初始化

使用陣列實現佇列時,初始狀態為front=0,rear=0.表示佇列裡沒有任何元素。如果有乙個元素,則front=0,rear=1。

void

clear()

(2)判空

bool

empty()

(3)求佇列中實際元素的個數

int

size()

4)入隊

入隊操作前,需要判斷佇列是否已滿。

void

push

(int x)

(5)出隊

void

pop(

)

(6)取隊首元素

int

get_front()

三:迴圈佇列隨著入隊與出隊操作的不斷進行,隊頭指標在陣列中不斷向隊尾方向移動,而在隊頭前面產生了一片不能利用的「空閒區」,當隊尾指標指向陣列最後乙個位置,即rear = maxn時,如果再有元素入隊就會出現「溢位」,這種溢位稱作「假溢位」。

如何解決這種情況呢?一種方法是每次出隊操作時,都向「空閒區」整體移動一位,帶來的後果是時間複雜度高了;另一種方法是讓陣列首尾相連,形成「環」狀,即所謂的「迴圈佇列」。

迴圈佇列初始時,front = rear = 0,如果 maxn 個元素乙個個依次入隊,則 rear = maxn,此時再有元素入隊,則它會被存放在 q[0] 這個單元,也會出現 front = rear = 0,與隊空時的狀態一樣。解決方法是少用乙個元素空間,約定資料入隊前,測試「隊尾指標在迴圈意義下加 1 後是否等於頭指標」作為判斷「隊滿」的條件。迴圈佇列的實際長度為 (rear - front + maxn) % maxn。

迴圈佇列的重要操作修改如下(使用 q[0] 這個單元):

(1)判斷隊滿:如果(rear + 1) % maxn = front,則佇列已滿。

(2)入隊:如果佇列未滿,則執行:rear = (rear + 1) % maxn;q[rear] = x;

(3)出隊:如果佇列不為空,則執行:front = (front + 1) % maxn;

四:取牌遊戲

【問題描述】

小明正在使用一堆共 k 張紙牌與 n-1 個朋友玩取牌遊戲。其中,n≤k≤100000,2≤n≤100,k 是 n 的倍數。紙牌中包含 m=k/n 張「good」牌和 k-m 張「bad」牌。小明負責發牌,他當然想自己獲得所有「good」牌。

他的朋友懷疑他會欺騙,所以他們給出以下一些限制,以防小明耍詐:

1)遊戲開始時,將最上面的牌發給小明右手邊的人。

2)每發完一張牌,他必須將接下來的 p 張牌(1≤p≤10)一張一張地依次移到最後,放在牌堆的底部。

3)以逆時針方向,連續給每位玩家發牌。

小明迫切想贏,請你幫助他算出所有「good」牌放置的位置,以便他得到所有「good」牌。牌從上往下依次標註為 #1,#2,#3,…

【輸入格式】

第 1 行,3 個用乙個空格間隔的正整數 n、k 和 p。

【輸出格式】

m 行,從頂部按公升序依次輸出「good」牌的位置。

【輸入樣例】

3 9 2

【輸出樣例】37

8**:

#include

using

namespace std;

//定義陣列最大長度

const

int maxn =

100010

;//定義迴圈佇列陣列a

int a[maxn]

;//定義結果陣列

int result[maxn]

;int

main()

}//列印輸出,桶排序方法

for(

int i =

1; i <= k; i++

)return0;

}

執行結果:

參考:《資訊學奧賽課課通(c++)》

NEFUOJ P1633取牌遊戲 佇列 SET

本題是一道很明顯的佇列結構基礎應用 include using namespace std intmain sort good,good t for int i 0 i return0 佇列在此用了原始的queue佇列,但是考慮到其要將p個元素後置,其實還有一種更簡 ma 便 fan 的方法 使用雙...

C語言取牌遊戲

有54張撲克牌,兩個人輪流拿牌,每人每次最少取1張,最多取4張,誰拿最後一張誰輸。編寫模擬計算機先拿牌且必勝的演算法。分析 為了保證計算機勝利,因此最後的牌必須是人取到,而且只能剩餘1張。通過觀察發現,除去最後一張牌,還剩餘53張牌。除去第一次計算機取牌,之後的每次計算機如果要贏得遊戲,可以根據人取...

佇列及其應用

2 1為解決計算機主機與印表機之間速度不匹配問題,通常設定乙個列印資料緩衝區,主機將要輸出的資料依次寫入該緩衝區,而印表機則依次從該緩衝區中取出資料。該緩衝區的邏輯結構應該是?1分 堆疊佇列樹 圖 單位 浙江大學 2 2若已知一佇列用單向鍊錶表示,該單向鍊錶的當前狀態 含3個物件 是 1 2 3,其...