紙牌專家 Albert Smith正在寫一本關於紙牌遊戲的書。為了重複確認書中的例子,他正在寫程式來找出一副牌的最佳玩法。其中一種叫做「時鐘」紙牌的描述如下:紙牌被發出 去(面朝下)成為一個時鐘的樣式,每個小時的位置有一堆紙牌,然後在中心也有額外的一堆(總共13堆,這13堆的名字分別為A, 2, 3, ..., T, J, Q,K。見下圖)。發牌的順序為先發一點鐘的牌(面朝下),然後二點鐘的牌,依此發牌到十二點鐘,最後發時鐘中心的牌。如此重複4圈,也就是說一副牌有 52張,依此方法發牌,這13堆牌每堆會有4張牌。

遊戲開始的時候,K堆的最上面一張牌被翻開變成目前牌,然後看這張牌的點數,將這張牌移到相對的那堆牌最下面(面朝上),然後翻開這堆牌的最上方一 張牌成為目前牌。例如:如果目前牌的點數是J,那這牌就被移到J堆牌的最下面,然後翻開J堆牌的最上方那張牌成為目前牌。遊戲如此不斷下去直到要翻牌的時 候發現那堆牌已經沒有面朝下的牌了,這時候遊戲結束。如果所有的牌都被翻開,那表示你的運氣真的太好了!
你的任務是寫一個程式讀入一堆牌,然後模擬這個遊戲。
Input
輸入包含多組測試資料。每組測試資料4列,每列有13張牌的資料。每張牌以2個字元代表。第一個字元代表牌的點數(A=Ace, 2~9, T=10, J=Jack, Q=Queen, K=King),第二個字元代表牌的花色(C=Clubs, D=Diamonds, H=Hearts, S=Spades)
若遇到僅含#的一列代表輸入結束。請參考Sample Input。
Output
對每組測試資料輸出遊戲結束時總共翻開多少張牌(2位數,必要時在前面加0),以及最後被翻開的那張牌。輸出格式請參考Sample Output。
| Sample Input | Sample Output |
|
TS QC 8S 8D QH 2D 3H KH 9H 2H TH KS KC 9D JH 7H JD 2S QS TD 2C 4H 5H AD 4D 5D 6D 4S 9S 5S 7S JS 8H 3D 8C 3S 4C 6S 9C AS 7C AH 6H KD JC 7D AC 5C TC QD 6C 3C 6D 4S 9S 5S 7S JS 8H 3D 8C 3S 4C 6S 9C 9D JH 7H JD 2S QS TD 2C 4H 5H AD 4D 5D TS QC 8S 8D QH 2D 3H KH 9H 2H TH KS KC AS 7C AH 6H KD JC 7D AC 5C TC QD 6C 3C # |
44,KD
|
也是輕鬆解決的一題
但是中譯題目有瑕疵,Sample Input 裡面給的資料是【反過來的】
也就是,第一組 Sample Input 的情況,第 K 組牌翻開的次序應該是 TS 9D 6D AS
直接看中文翻譯的話一定會把輸入順序整個搞反
其他部分就沒什麼問題了
Ranking 有 63,還不賴,只花了 1.5 個小時左右
#include <stdio.h>
#include <stdlib.h>
struct Card_Style
{
int number;
char style;
};
int main()
{
char Ctmp;
int Itmp;
struct Card_Style Card[13][4];
int Card_Index[13],i,j,Open_Counter = 0;
int Round_Index = 13;
for(i=0;i<13;i++)
{
Card_Index[i] = 4;
}
while(scanf("%c",&Ctmp)==1)
{
if(Ctmp == '#') break;
else if(Ctmp >= '2' && Ctmp <= '9')
{
Round_Index--;
Card_Index[Round_Index]--;
Card[Round_Index][Card_Index[Round_Index]].number = Ctmp - '0';
scanf("%c",&Ctmp);
Card[Round_Index][Card_Index[Round_Index]].style = Ctmp;
}
else if(Ctmp >= 'A')
{
Round_Index--;
Card_Index[Round_Index]--;
if(Ctmp == 'T')
Card[Round_Index][Card_Index[Round_Index]].number = 10;
else if(Ctmp == 'J')
Card[Round_Index][Card_Index[Round_Index]].number = 11;
else if(Ctmp == 'Q')
Card[Round_Index][Card_Index[Round_Index]].number = 12;
else if(Ctmp == 'K')
Card[Round_Index][Card_Index[Round_Index]].number = 13;
else if(Ctmp == 'A')
Card[Round_Index][Card_Index[Round_Index]].number = 1;
scanf("%c",&Ctmp);
Card[Round_Index][Card_Index[Round_Index]].style = Ctmp;
}
else
{
continue;
}
if(Round_Index == 0)
{
if(Card_Index[0] != 0)
{
Round_Index = 13;
}
else
{
Round_Index = 12;
for(i=0;i<13;i++)
{
Card_Index[i] = 4;
}
while(Card_Index[Round_Index] != 0)
{
j = --Card_Index[Round_Index];
i= Round_Index;
Itmp = Round_Index;
Round_Index = Card[Itmp][j].number - 1 ;
Open_Counter++;
}
if(Card[i][j].number > 9 || Card[i][j].number < 2)
{
if(Card[i][j].number == 10)
Ctmp = 'T';
else if(Card[i][j].number == 11)
Ctmp = 'J';
else if(Card[i][j].number == 12)
Ctmp = 'Q';
else if(Card[i][j].number == 13)
Ctmp = 'K';
else if(Card[i][j].number == 1)
Ctmp = 'A';
}
else
{
Ctmp = '0' + Card[i][j].number;
}
if(Open_Counter < 10) printf("0");
printf("%d,%c%c\n",Open_Counter,Ctmp,Card[i][j].style);
Round_Index = 13;
Open_Counter = 0;
for(i=0;i<13;i++)
{
Card_Index[i] = 4;
}
}
}
}
return 0;
}
留言列表

