蓝桥杯第八届省赛JAVA真题----拉马车
生活随笔
收集整理的這篇文章主要介紹了
蓝桥杯第八届省赛JAVA真题----拉马车
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
標題:拉馬車
小的時候,你玩過紙牌游戲嗎? 有一種叫做“拉馬車”的游戲,規則很簡單,卻很吸引小朋友。 其規則簡述如下: 假設參加游戲的小朋友是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 請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。 所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 不要使用package語句。不要使用jdk1.7及以上版本的特性。 主類的名字必須是:Main,否則按無效代碼處理。 ---------------------------- 笨笨有話說: 不斷刪除前邊的,又要后邊添加.... 如果用數組,需要開一個大點的,請佛祖保佑在游戲結束前,不會用到數組的邊緣。 歪歪有話說: 反正串也不長,不如每次操作都返回一個新的串。 默默有話說: 我一般都不吱聲,這是典型的隊列結構,動態數組最好,沒有?自己造一個唄!
小的時候,你玩過紙牌游戲嗎? 有一種叫做“拉馬車”的游戲,規則很簡單,卻很吸引小朋友。 其規則簡述如下: 假設參加游戲的小朋友是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 請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。 所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。 不要使用package語句。不要使用jdk1.7及以上版本的特性。 主類的名字必須是:Main,否則按無效代碼處理。 ---------------------------- 笨笨有話說: 不斷刪除前邊的,又要后邊添加.... 如果用數組,需要開一個大點的,請佛祖保佑在游戲結束前,不會用到數組的邊緣。 歪歪有話說: 反正串也不長,不如每次操作都返回一個新的串。 默默有話說: 我一般都不吱聲,這是典型的隊列結構,動態數組最好,沒有?自己造一個唄!
思路:對于這種雙方交替進行的題目還是理解不好,這個題目簡單來說就是對數據結構的運用,比如采用ArrayList(由于操作會有插入的操作,如果用普通的數組的話不太容易控制大小,推薦使用動態數組或者鏈式的其他結構,而且由于操作的是char類型,所以泛型寫成Character更方便操作)可以使用remove(0)直接移出首個元素,而indexOf可以找到指定元素,最巧妙的是lastindexOf()可以找到元素上一次出現的位置?;具壿嬀褪请p方交替,交替之前要完成數據的插入與刪除,還要記錄這次處理的數據temp。其中如果數據處理完后出現出現可取牌的情況,則需要完成補牌的過程。每次都要判斷是否出現一方無牌的情況,以保證程序的終止。
import java.util.ArrayList; import java.util.Iterator; import java.util.Scanner;public class Main {static char temp;static boolean ok = true;static boolean flag = true;static ArrayList<Character> a = new ArrayList<Character>();static ArrayList<Character> b = new ArrayList<Character>();static ArrayList<Character> onging = new ArrayList<Character>();public static void main(String[] args) {String str;Scanner input = new Scanner(System.in);//輸入str = input.next();for (char cha : str.toCharArray()) {a.add(cha);}str = input.next();for (char cha : str.toCharArray()) {b.add(cha);}//執行while (ok) {if (flag) {ok = underway(a, onging);if(ok) {flag = sourse(flag, a, onging);}} else {ok = underway(b, onging);if(ok) {flag = sourse(flag, b, onging);}}}// 打印if(flag){Iterator<Character> it = b.iterator();while (it.hasNext()) {System.out.print(it.next());}} else {Iterator<Character> it = a.iterator();while (it.hasNext()) {System.out.print(it.next());}}}//出牌public static boolean underway(ArrayList<Character> x, ArrayList<Character> onging) {temp = x.remove(0);onging.add(temp);// 如果其中一方沒牌或者出現一次可贏局面(可以拿走牌的情況)if(x.size() == 0 && onging.lastIndexOf(temp) == onging.indexOf(temp)) {return false;}return true;}public static boolean sourse(boolean flag, ArrayList<Character> x, ArrayList<Character> onging) {if(onging.size() != 0) {// temp出現的位置更新說明,又出現了一個temp,取牌后繼續執行;反之,沒有出現相同的,下個人執行if(onging.lastIndexOf(temp) == onging.indexOf(temp)) {return !flag;}int end = onging.indexOf(temp) - 1;// 將lastIndex---Index中間的添加到x中,同時從ongoing中移出while (onging.size()-1 != end) {int onMax = onging.size()-1;x.add(onging.get(onMax));onging.remove(onMax);}}return flag;} }總結
以上是生活随笔為你收集整理的蓝桥杯第八届省赛JAVA真题----拉马车的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RSA不下载批次的问题
- 下一篇: VI操作--跳到最后一行和跳到最后一行的