問題描述
小的時候,你玩過紙牌遊戲嗎?
有一種叫做「拉馬車」的遊戲,規則很簡單,卻很吸引小朋友。
其規則簡述如下:
假設參加遊戲的小朋友是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 我們忽略了紙...