2010年2月10日 星期三

Problem 170 Clock Patience,紙牌遊戲

Problem 170 此題最大的問題就是它的敘述有誤,它說是依照 A 順時針發到 Q,再發 K。真正的發牌順序是先發 K,再從 Q 逆時針發到 A。而最上面的牌是第一列的牌,最下面的牌是第四列的牌。除此之外就沒有問題了,可是題目敘述搞成這樣,讓人霧煞煞,真是"奇牌"。

例如:
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
而 K 堆牌由上而下為 TS、9D、6D、AS,Q 堆牌由上而下為 QC、JH、4S、7C,以此類推。再來,如果輸出向上翻的牌數為個位數,前面要加 0。

一開始先建立一個結構(struct),為以下程式碼:
struct Poker
{
char points;
char color;
int isExist;
};
struct Poker p[13][4];

再依次將牌擺入陣列之中:

char str[40];  
int i, j, nIndex, k = 0, isTurn, turnCount;
char ch, nowPoints, nowColor;
for (i = 0 ; i < 4; i ++)
{
memset(str, 0, strlen(str));
gets(str);
if (str[0] == '#') break;
j = 0;
while (str[j] != '\0')
{
if (j % 3 == 0)
ch = str[j];
else if (j % 3 == 1)
{
p[(j-1)/3][k].points = ch;
p[(j-1)/3][k].color = str[j];
p[(j-1)/3][k].isExist = 1;
}
j ++;
}
k ++;
}
if (str[0] == '#') break;

接下來,只須將 K 堆第一個牌記錄下來,以上面的例子來看為 TS,將它的 isExist 變為 0,再去尋找 T 堆牌的第一張牌 8S,判斷它的 isExist 為不為 1,若不為 1 再看第二張牌,但它為 1,所以再去尋找 8 堆牌的第一張牌,如此如此找下去,當找到四張牌 isExist 都是 0 時,就印出目前紀錄的牌就可以了。

By David.K

p170題目連結
回ACM題庫目錄
回首頁

沒有留言: