藍橋杯--拉馬車--維護動態陣列
阿新 • • 發佈:2019-02-15
題目描述
小的時候,你玩過紙牌遊戲嗎?
有一種叫做“拉馬車”的遊戲,規則很簡單,卻很吸引小朋友。
其規則簡述如下:
假設參加遊戲的小朋友是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
樣例輸出
小的時候,你玩過紙牌遊戲嗎?
有一種叫做“拉馬車”的遊戲,規則很簡單,卻很吸引小朋友。
其規則簡述如下:
假設參加遊戲的小朋友是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
分析:這道題沒什麼思維難度,就是維護a,b以及桌子上的牌,只不過每一個是動態變化的,最後結束的條件就是一方手中的牌數目為0,看程式碼,邏輯是很簡單的的:
反思:使用動態陣列的時候一定要注意,陣列的長度會隨著處理而變化,自然索引值也會變化,所以某些情況下利用for迴圈來遍歷索引值是不可取的!import java.util.*; public class Main { static Scanner in = new Scanner(System.in); static Vector<Character> init(String s) {//初始化 Vector<Character> res = new Vector<Character>(); for(int i = 0;i < s.length();i++) res.add(s.charAt(i)); return res; } static int isWin(Vector<Character> v,char c) {//是否贏牌,即判斷前面是否出現過 for(int i = 0;i < v.size() - 1;i++) if(v.get(i)==c) return i; return -1; } static void print(Vector<Character> v) { for(int i = 0;i < v.size();i++) System.out.print(v.get(i)); System.out.println(); } public static void main(String[] args) { String a = in.next(); String b = in.next(); Vector<Character> aa = new Vector<Character>(); Vector<Character> bb = new Vector<Character>(); Vector<Character> cc = new Vector<Character>(); aa = init(a); bb = init(b); cc.clear(); char k; int p = 0; boolean f; k = aa.remove(0);//a先出牌 cc.add(k); f = true; while(aa.size()!=0&&bb.size()!=0){ if(f) {//b出牌 f = false; k = bb.remove(0); cc.add(k); p = isWin(cc, k); if(p!=-1) { for(int i = cc.size()-1;i >= p;i--) { bb.add(cc.get(i)); } while(cc.size()>p) cc.remove(cc.size()-1); f = true;//贏牌繼續出 } }else {//a出牌 f= true; k = aa.remove(0); cc.add(k); p = isWin(cc, k); if(p!=-1) { for(int i = cc.size()-1;i >= p;i--) { aa.add(cc.get(i)); } while(cc.size()>p) cc.remove(cc.size()-1); f = false;//贏牌繼續出 } } } if(aa.size()==0) print(bb); if(bb.size()==0) print(aa); } }