藍橋杯 拉馬車 C語言,可除錯

2021-09-12 09:06:04 字數 3616 閱讀 2355

小的時候,你玩過紙牌遊戲嗎?

有一種叫做「拉馬車」的遊戲,規則很簡單,卻很吸引小朋友。

其規則簡述如下:

假設參加遊戲的小朋友是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

不能通過工程設定而省略常用標頭檔案。

提交程式時,注意選擇所期望的語言型別和編譯器型別。

----------------------------

笨笨有話說:

不斷刪除前邊的,又要後邊新增.... 如果用陣列,需要開乙個大點的,請佛祖保佑在遊戲結束前,不會用到陣列的邊緣。

歪歪有話說:

反正串也不長,不如每次操作都返回乙個新的串。

默默有話說:

我一般都不吱聲,這是典型的佇列結構,動態陣列最好,沒有?自己造乙個唄!

這裡說一下:三種方法

1. 笨笨有話說:

不斷刪除前邊的,又要後邊新增.... 如果用陣列,需要開乙個大點的,請佛祖保佑在遊戲結束前,不會用到陣列的邊緣。

開乙個超大的陣列默,那個是否會一直迴圈,可以自己定義乙個量 比如5000,如果超過這個數就是死迴圈

2. 歪歪說的: 每次都重新賦值

3. 默默說的,用動態陣列,還不是太明白,我用的迴圈佇列

這次方法我用的迴圈佇列,, 判斷重複的話是自己定義了乙個量,我也謝了乙個判斷是否會重複的函式沒有用

我寫的這個可以複製下去,自己除錯,我寫了,a[a1] = '~';這個賦值的,這個是專門用來除錯,便於觀察

大家可以自己複製下去,除錯一下

還有就是:這種題,不難是不難,但就是需要判斷好下標,模擬情況,這個就不是很容易了,或許是我基本沒有做過關於字串的題

本來想用函式傳值,但沒用

我用的方法是迴圈佇列,加上自己定義的乙個超大的量,如果超過了,就說明是個死迴圈,

可以確定的是,a 和 b陣列不會超出最下標

資料結構裡面的乙個,佇列,迴圈佇列

下面是**

#include#include#define n 100

int strrch(char c,char ch,int i) //判斷是都有重複

return -1;

}int islink(char a,char b,int a1,int a2,int b1,int b2,int k)//想用自己呼叫

for(i = a1; i != a2; i = (i+1)%100)

for(i = b1; i != b2; i = (i+1)%100)

}if(k == 1)//代表b

for(i = b1; i != b2; i = (i+1)%100)

for(i = a1; i != a2; i = (i+1)%100)

}return 1;

}int main()

,b[n] = ,c[110] = ;

int i,j,k,count = 0;

scanf("%s%s",a,b);

int c1 = 0,a1 = 0,a2 = strlen(a),b1 = 0,b2 = strlen(b);

while(count < 10000)

c1 = k;//牌挪完之後,下表歸位

c[c1] = a[a1]; //贏牌之後繼續出牌

k = strrch(c,a[a1],c1);//再次判斷是否有重複

a[a1] = '~';//方便判斷 ,可不要

a1 = (a1+1)%n;//陣列的開始下標 +1

}c1 +=1;//桌面上的牌的下標 ,,,,這個要注意

} else//如果沒有贏牌

}

c[c1] = b[b1];//b出牌

b[b1] = '~';//方便檢視 ,可不要

k = strrch(c,c[c1],c1);

if(k != -1)//如果b1贏牌

//a1--;

c1 = k;//牌挪完之後,下表歸位

c[c1] = b[b1]; //贏牌之後繼續出牌

k = strrch(c,b[b1],c1);//再次判斷是否有重複

b[b1] = '~';//方便判斷

b1 = (b1+1)%n;//陣列的開始下標加上一

}c1 +=1;//桌面上的牌的下標 ,,,這個要注意

} else//沒有贏牌

}} if(count == 10000)

printf("-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 我...

藍橋杯 歷屆試題 拉馬車 棧與佇列

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

C語言 藍橋杯初級

問題描述 給定n個十六進製制正整數,輸出它們對應的八進位制數。輸入格式 輸入的第一行為乙個正整數n 1 n 10 接下來n行,每行乙個由09 大寫字母af組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。輸出格式 輸出n行,每行為輸入對應的八進位制正整數。注意 輸入的...