2011-09-01 09:27:29Morris

d088. 127 - "Accordian" Patience

d088. 127 - "Accordian" Patience

內容 :

你的任務是模擬一種叫「Accordian」的紙牌遊戲,他的遊戲規則如下:

一 副撲克牌有52張牌,首先把紙牌一張一張由左到右排好(不能有重疊,所以共有52堆牌,每堆一張),當某一張牌與他左邊那張牌或者左邊的第三張牌 有「Match」的時候,就把這張牌移到那張牌上面去。在這裡兩張牌「Match」指的是這兩張牌的花色(suit)或者點數(rank)一樣。當你做了 一個移動之後,要察看是否還可以做其他的移動。在任何時間,只有最上面那張牌可以被移動。如果因為移動一張牌使得產生一個空格(也就是被移動的那堆牌只有 一張牌),你必須把右邊所有的牌堆往左移一格。如此不斷的尋找可移動的牌,直到沒有一張牌可以移動遊戲就結束了。

在選擇可以移動的牌的時候可能有些狀況會發生。如果有兩張牌都可以移動,你應該要移動最左邊的那張牌。當一張牌可以被移動到左邊一格,或左邊三格的時候,你必須移動到左邊三格。

 

輸入說明 :

輸入包含多組測試資料。每組測試資料兩列,每 列有26張牌的資料。每張牌以2個字元代表。第一個字元代表牌的點數(A=Ace, 2~9, T=10, J=Jack, Q=Queen, K=King),第二個字元代表牌的花色(C=Clubs, D=Diamonds, H=Hearts, S=Spades)

若遇到僅含#的一列代表輸入結束。請參考Sample Input。

輸出說明 :

對每組測試資料輸出遊戲結束時剩下幾堆牌,以及每堆牌有多少張牌。請注意如果只有1堆牌,pile後沒有加s,請參考Sample Output。

範例輸入 :

QD AD 8H 5S 3H 5H TC 4D JH KS 6H 8S JS AC AS 8D 2H QS TS 3S AH 4H TH TD 3C 6S
8C 7D 4C 4S 7S 9H 7C 5D 2S KD 2D QH JD 6D 9D JC 2C KH 3D QC 6C 9S KC 7H 9C 5C
AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC AD 2D 3D 4D 5D 6D 7D 8D TD 9D JD QD KD
AH 2H 3H 4H 5H 6H 7H 8H 9H KH 6S QH TH AS 2S 3S 4S 5S JH 7S 8S 9S TS JS QS KS
#

範例輸出 :

6 piles remaining: 40 8 1 1 1 1
1 pile remaining: 52

提示 :

* 中文翻譯:Lucky 貓

出處 :

Uva ACM 127 (管理:MAPLEWING)



作法 : 模擬

/**********************************************************************************/
/*  Problem: d088 "127 - "Accordian" Patience" from Uva ACM 127                   */
/*  Language: C                                                                   */
/*  Result: AC (4ms, 228KB) on ZeroJudge                                          */
/*  Author: morris1028 at 2011-09-01 09:24:52                                     */
/**********************************************************************************/


#include<stdio.h>
struct {
    int x, y;
}Stack[52][52];
main() {
    char s[3];
    while(scanf("%s", s) == 1 && s[0] != '#') {
        Stack[0][0].x = s[0], Stack[0][0].y = s[1];
        int Stacktop[52] = {}, i, j, k, pile = 51, Flag;
        for(i = 1; i < 52; i++) {
            scanf("%s", s);
            Stack[i][0].x = s[0], Stack[i][0].y = s[1];
        }
        while(1) {
            Flag = 0;
            for(i = 0; i <= pile; i++) {
                if(i >= 3 && (Stack[i][Stacktop[i]].x == Stack[i-3][Stacktop[i-3]].x ||
                    Stack[i][Stacktop[i]].y == Stack[i-3][Stacktop[i-3]].y)) {
                    Stack[i-3][++Stacktop[i-3]] = Stack[i][Stacktop[i]--];
                    Flag = 1;
                }
                if(i >= 1 && (Stack[i][Stacktop[i]].x == Stack[i-1][Stacktop[i-1]].x ||
                    Stack[i][Stacktop[i]].y == Stack[i-1][Stacktop[i-1]].y) && Flag == 0) {
                    Stack[i-1][++Stacktop[i-1]] = Stack[i][Stacktop[i]--];
                    Flag = 1;
                }
                if(Stacktop[i] == -1) {
                    for(j = i+1; j <= pile; j++) {
                        for(k = 0; k <= Stacktop[j]; k++)
                            Stack[j-1][k] = Stack[j][k];
                        Stacktop[j-1] = Stacktop[j];
                    }
                    pile--;
                }
                if(Flag)    break;
            }
            if(Flag == 0)
                break;
        }
        printf("%d pile%s remaining:", pile+1, pile == 0 ? "" : "s");
        for(i = 0; i <= pile; i++)
            printf(" %d", Stacktop[i]+1);
        puts("");
    }
    return 0;
}
xem phim online 2017-10-03 14:06:35

nice article...