UVa-127 "Accordian" Patience

来源:互联网 发布:试卷生成软件 编辑:程序博客网 时间:2024/05/22 06:40

题目上个中文的

Description

模拟玩一个“手风琴”纸牌游戏,规则如下:

按从左至右的顺序发牌,并摆成一行,发牌不要相互重叠。游戏中一旦出现任何一张牌与它左边的第一张或第三张“匹配”,即花色或点数相同,则须立即将其移动到那张牌上面。如果牌被移动后又出现了上述情况,则需再次向左移动。每叠牌只能移动最上面的一张。如果一叠牌被移空,应该立即将右边各叠整体向左移动,补上这个空隙。依次将整副牌都发完,并不断的向左合并。如果全部移动结束后整副牌都放成了一叠,则游戏胜利。

玩上几次你就会遇到一些状况。如果同时有两张牌都可以移动,你应该采取的策略是移动最左边的牌(当然必须是可以移动的)。当一张牌既可以移动到左边第一张,又可以移动到左边第三张时,应移动到左边第三张上面。

Input

输入到程序中的数据指定了一副牌的顺序。每组输入包括两行,每行26张牌,牌与牌之间用空格隔开。以#号开头的一行作为输入的结束行。每张牌由两个字符表示,第一个字符是点数:(A、 2-9、T=10、J、Q, K);第二个字符是花色:(C=梅花、D=方块、H=红心、S=黑桃)。

Output

每两行输入(定义了一副52张牌的顺序)必须产生一行输出。每行输出包括剩下的叠数以及每叠中的牌数。

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
#

Sample Output

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


心路历程:好久没写博客了,前段时间很倦,刷的有意义的题也不多,现在又重新开始继续刷题了,这个题目是学校oj的一个题目,也是uva的一道题目,题目并不难,只需要把过程从第一张牌开始往后面模拟就好,每当遇到要交换的情况,就进行操作,推后到前面那一张牌即可,如果有一叠牌空了,那就将它移除(只要吧整套牌构成的数组在清空的位置向前移一位即可),如果无法再进行交换,就结束进行输出。

PS:前段时间一个学长说过,努力和努力之间还差着很多的努力,有许多比你优秀的人比你还要努力。感觉最近学习的状态十分的浮躁,沉不下心去安静刷题,这种状态要去克服。现在我付出的努力还不足以去支撑我的梦想,未来要加倍的努力,努力向前追赶。生命不息,AC不止。

#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#include <ctype.h>#define MAX 60typedef struct{    char status[MAX][3];    int sum;}HHH;HHH poker[MAX];int cnt;void deal(int n, int x){    int left = poker[n - x].sum;    int right = poker[n].sum;    for(int i = 0; i < 3; i++)        poker[n - x].status[left + 1][i] = poker[n].status[right][i];    poker[n].sum --;    poker[n - x].sum ++;    if(poker[n].sum < 0){        cnt++;        for(int i = n; i < 52 - cnt; i++)            poker[i] = poker[i + 1];    }}int main(){    while(scanf("%s", poker[0].status[0])){        cnt = 0;        poker[0].sum = 0;        if(strcmp(poker[0].status[0], "#") == 0)            break;        for(int i = 1; i < 52; i++){            scanf("%s", poker[i].status[0]);            poker[i].sum = 0;        }        for(int i = 0; i < 52 - cnt; i++){            int right = poker[i].sum;            int left1 = poker[i - 1].sum;            int left2 = poker[i - 3].sum;            if(i >= 3 && (poker[i].status[right][0] == poker[i - 3].status[left2][0] ||                          poker[i].status[right][1] == poker[i - 3].status[left2][1])){                deal(i, 3);                i = i - 4;            }            else if(i >= 1 && (poker[i].status[right][0] == poker[i - 1].status[left1][0] ||                               poker[i].status[right][1] == poker[i - 1].status[left1][1])){                deal(i, 1);                i = i - 2;            }        }        if(cnt == 51){            printf("1 pile remaining: 52\n");        }        else{            printf("%d piles remaining:", 52 - cnt);            for(int i = 0; i < 52 - cnt; i++)                printf(" %d", poker[i].sum + 1);            printf("\n");            memset(poker, 0, sizeof(poker));        }    }    return 0;}


0 0