拉马车
問題描述
小的時候,你玩過紙牌游戲嗎?有一種叫做“拉馬車”的游戲,規則很簡單,卻很吸引小朋友。
其規則簡述如下:
假設參加游戲的小朋友是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 <xxx>
不能通過工程設置而省略常用頭文件。
提交程序時,注意選擇所期望的語言類型和編譯器類型。
----------------------------
笨笨有話說:
不斷刪除前邊的,又要后邊添加.... 如果用數組,需要開一個大點的,請佛祖保佑在游戲結束前,不會用到數組的邊緣。
歪歪有話說:
反正串也不長,不如每次操作都返回一個新的串。
默默有話說:
我一般都不吱聲,這是典型的隊列結構,動態數組最好,沒有?自己造一個唄!
Algorithm
這是一種很奇怪的體驗:代碼居然一次就通過了,Oh,No。
個人不喜歡打牌,因此就模擬了一下,然后就,一次性通過了~~
不過,題目很簡單的。還是覺得遞歸舒服~
?AC?
1 #include<iostream> 2 #include<vector> 3 #include<string> 4 5 using namespace std; 6 7 vector<char> A, B, T; 8 string a, b; 9 10 void print(vector<char> A) 11 { 12 for(int i=0;i<A.size();i++) 13 cout<<A.at(i); 14 cout<<'\n'; 15 T.clear(); 16 } 17 18 int bingo(vector<char> T) 19 { 20 int x = T.size(); 21 for(int i=0;i<T.size()-1;i++) 22 if(T.at(x-1) == T.at(i)) 23 return T.size() - i; 24 return 0; 25 } 26 27 void fun(vector<char> A, vector<char> B, char k) 28 { 29 if(A.size() == 0 || B.size() == 0){ 30 (A.size() == 0)?print(B):print(A); 31 return; 32 } 33 if(k == 'A'){ 34 T.push_back(A.at(0)); 35 A.erase(A.begin()); 36 int x = bingo(T); 37 int z = x; 38 if(x){ // A 贏了 39 int y = T.size(); 40 while(x--) A.push_back(T.at(--y)); 41 while(z--) T.erase(T.end()-1); 42 fun(A, B, 'A'); 43 } 44 else fun(A, B, 'B'); 45 } 46 if(k == 'B'){ 47 T.push_back(B.at(0)); 48 B.erase(B.begin()); 49 int x = bingo(T); 50 int z = x; 51 if(x){ // B 贏了 52 int y = T.size(); 53 while(x--) B.push_back(T.at(--y)); 54 while(z--) T.erase(T.end()-1); 55 fun(A, B, 'B'); 56 } 57 else fun(A, B, 'A'); 58 } 59 } 60 61 int main() 62 { 63 while(cin>>a>>b) 64 { 65 for(int i=0;i<a.size();i++) 66 A.push_back(a.at(i)); 67 for(int i=0;i<b.size();i++) 68 B.push_back(b.at(i)); 69 70 string c = a + b; 71 int t[100] = {0}, f = 1; 72 for(int i=0;i<c.size();i++) 73 t[(int)c.at(i)]++; 74 for(int i=48;i<100;i++) 75 if(t[i] >= 2) 76 f = 0; 77 if(f){ // A 和 B 沒有共同的牌,此時無法結束 78 cout<<"-1"<<endl; 79 continue; 80 } 81 fun(A, B, 'A'); 82 A.clear(); 83 B.clear(); 84 } 85 86 getchar(); 87 88 return 0; 89 } View Code?
2019-02-15
17:32:12
轉載于:https://www.cnblogs.com/mabeyTang/p/10384883.html
總結
- 上一篇: 正威集团股票代码
- 下一篇: 前嗅ForeSpider教程:如何创建新