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。
輸出說明
:
範例輸入 :
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
提示
:
出處
:
/**********************************************************************************/
/* 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;
}
nice article...