日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拉马车

發布時間:2023/12/31 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拉马车 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題描述

  小的時候,你玩過紙牌游戲嗎?
  有一種叫做“拉馬車”的游戲,規則很簡單,卻很吸引小朋友。

  其規則簡述如下:
  假設參加游戲的小朋友是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

總結

以上是生活随笔為你收集整理的拉马车的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。