藍橋杯 歷屆試題 拉馬車 棧與佇列

2021-09-25 10:31:50 字數 3552 閱讀 7934

問題描述

小的時候,你玩過紙牌遊戲嗎?

有一種叫做「拉馬車」的遊戲,規則很簡單,卻很吸引小朋友。

其規則簡述如下:

假設參加遊戲的小朋友是a和b,遊戲開始的時候,他們得到的隨機的紙牌序列如下:

a方:[k, 8, x, k, a, 2, a, 9, 5, a]

b方:[2, 7, k, 5, j, 5, q, 6, k, 4]

其中的x表示「10」,我們忽略了紙牌的花色。

從a方開始,a、b雙方輪流出牌。

當輪到某一方出牌時,他從自己的紙牌佇列的頭部拿走一張,放到桌上,並且壓在最上面一張紙牌上(如果有的話)。

此例中,遊戲過程:

a出k,b出2,a出8,b出7,a出x,此時桌上的序列為:

k,2,8,7,x

當輪到b出牌時,他的牌k與桌上的紙牌序列中的k相同,則把包括k在內的以及兩個k之間的紙牌都贏回來,放入自己牌的隊尾。注意:為了操作方便,放入牌的順序是與桌上的順序相反的。

此時,a、b雙方的手裡牌為:

a方:[k, a, 2, a, 9, 5, a]

b方:[5, j, 5, q, 6, k, 4, k, x, 7, 8, 2, k]

贏牌的一方繼續出牌。也就是b接著出5,a出k,b出j,a出a,b出5,又贏牌了。

5,k,j,a,5

此時雙方手裡牌:

a方:[2, a, 9, 5, a]

b方:[q, 6, k, 4, k, x, 7, 8, 2, k, 5, a, j, k, 5]

注意:更多的時候贏牌的一方並不能把桌上的牌都贏走,而是拿走相同牌點及其中間的部分。但無論如何,都是贏牌的一方繼續出牌,有的時候剛一出牌又贏了,也是允許的。

當某一方出掉手裡最後一張牌,但無法從桌面上贏取牌時,遊戲立即結束。

對於本例的初始手牌情況下,最後a會輸掉,而b最後的手裡牌為:

9k2a62kax58k57kj5

本題的任務就是已知雙方初始牌序,計算遊戲結束時,贏的一方手裡的牌序。當遊戲無法結束時,輸出-1。

輸入為2行,2個串,分別表示a、b雙方初始手裡的牌序列。

輸出為1行,1個串,表示a先出牌,最後贏的一方手裡的牌序。

樣例輸入

96j5a898qa

6278a7q973

樣例輸出

2j9a7qa6q6889977

樣例輸入

25663k6x7448

j88a5kjxx45a

樣例輸出

6kaj458kxax885xj645

資料規模和約定

我們約定,輸入的串的長度不超過30

資源約定:

峰值記憶體消耗(含虛擬機器) < 256m

cpu消耗 < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入…」 的多餘內容。

注意:main函式需要返回0;

只使用ansi c/ansi c++ 標準;

不要呼叫依賴於編譯環境或作業系統的特殊函式。

所有依賴的函式必須明確地在原始檔中 #include

不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

明顯的棧與佇列資料結構。牌面為棧,a,b為佇列,接下來模擬拉馬車過程。

1.將a, b初始牌入隊。

2.a出隊(出牌),將a的出隊元素壓進牌面。

3.檢索牌面是否有與a出的牌相同,若有,則將這一段牌反向入a隊同時牌面出棧,並且a再次出牌……

4.a出牌後若判斷a隊列為空,則判b贏牌。

b同理。

牌面不能用stl裡的stack,因為stack是容器介面卡,無法遍歷,因此就無法進行檢索過程。

這道題主要難在要處理的內容和細節太多,而且某一處地方不對,結果就不對,debug比較困難。另外,這道題的所有測試資料都有結果,-1不用判定也可以

下面乙個**是大一寒假做的,當時還不會用stl,手寫鏈隊,將細節全盤列印出來(因為要debug…)

#include

#include

using namespace std;

typedef

struct node

queue;

void

create

(queue *

&l, queue *

&r)//建立佇列並傳遞尾指標

r->next =

null;}

void

print

(queue *

&l)//輸出佇列

printf

("\n");

}int

main()

r1->next =

null

; top = i-1;

//牌面出棧

a[top+1]

='\0'

;printf

("a贏牌:");

print

(l1)

;printf

("a贏牌,牌面:");

puts

(a);

ok2 =0;

//2不能出牌。(因此ok1再出一次牌)

break;}

}}if(ok2 && l1->next !=

null

)//若b出牌之後沒牌了,a直接胡

r2->next =

null

; top = i-1;

//牌面出棧

a[top+1]

='\0'

;printf

("b贏牌:");

print

(l2)

;printf

("b贏牌,牌面:");

puts

(a);

ok1 =0;

//2不能出牌。(因此ok1再出一次牌)

break;}

}}}if

(l1->next ==

null

)else

if(l2->next ==

null

)else

printf

("系統出錯\n");

return0;

}

下面上用stl寫的ac**,因為queue也是容器介面卡,無法遍歷,所以不能將整個細節列印出來。

#include

#include

using namespace std;

intmain()

}if(sign !=-1

)//a贏牌

if(a.

empty()

)//若a出牌後沒牌了,判b贏 }if

(ok_b)}if

(sign !=-1

)//b贏牌

if(b.

empty()

)//若b出牌後沒牌了,判a贏 }}

//判定結果

if(flag ==1)

}else

if(flag ==2)

}else cout<<-1

}

藍橋杯 歷屆試題 拉馬車(C )

問題描述 小的時候,你玩過紙牌遊戲嗎?有一種叫做 拉馬車 的遊戲,規則很簡單,卻很吸引小朋友。其規則簡述如下 假設參加遊戲的小朋友是a和b,遊戲開始的時候,他們得到的隨機的紙牌序列如下 a方 k,8,x,k,a,2,a,9,5,a b方 2,7,k,5,j,5,q,6,k,4 其中的x表示 10 我...

藍橋杯歷屆試題 尤拉與雞蛋

大數學家尤拉在集市上遇到了本村的兩個農婦,每人跨著個空籃子。她們和尤拉打招呼說兩人剛剛賣完了所有的雞蛋。尤拉隨便問 賣了多少雞蛋呢?不料乙個說 我們兩人自己賣自己的,一共賣了150個雞蛋,雖然我們賣的雞蛋有多有少,但剛好得了同樣的錢數。你猜猜看!尤拉猜不出。另乙個補充道 如果我按她那樣的 賣,可以得...

拉馬車 佇列和棧

小的時候,你玩過紙牌遊戲嗎?有一種叫做 拉馬車 的遊戲,規則很簡單,卻很吸引小朋友。其規則簡述如下 假設參加遊戲的小朋友是a和b,遊戲開始的時候,他們得到的隨機的紙牌序列如下 a方 k,8,x,k,a,2,a,9,5,a b方 2,7,k,5,j,5,q,6,k,4 其中的x表示 10 我們忽略了紙...