UVA 127 - Accordian Patience

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


char a[2][100];
char p[300];


struct data
{
    char suit[52];
    char size[52];
    int num;
} pk[55];
int top[52];
int three(int i,int len)
{
    int j;
    top[i-3]++;
    pk[i-3].num+=pk[i].num;
    pk[i-3].size[top[i-3]]=pk[i].size[top[i]];
    pk[i-3].suit[top[i-3]]=pk[i].suit[top[i]];
    //pk[i].suit[top[i]]=pk[i].suit[top[i-1]];
    //pk[i].size[top[i]]=pk[i].size[top[i-1]];
    top[i]--;
    if(top[i]<0){
        for(j=i; j<len; j++)
        {
            pk[j].num=pk[j+1].num;
            pk[j].size[top[j]]=pk[j+1].size[top[j]];
            pk[j].suit[top[j]]=pk[j+1].suit[top[j]];
        }
    pk[len].size[top[j]]='\0';
    pk[len].suit[top[j]]='\0';
    pk[j].num='\0';}
}
int one(int i,int len)
{
    int j;
    top[i-1]++;
    pk[i-1].num+=pk[i].num;
    pk[i-1].size[top[i]]=pk[i].size[top[i]];
    pk[i-1].suit[top[i]]=pk[i].suit[top[i]];
    //pk[i].suit[top[i]]=pk[i].suit[top[i-1]];
    //pk[i].size[top[i]]=pk[i].size[top[i-1]];
    top[i]--;
    if(top[i]<0)
        {for(j=i; j<len; j++)
        {
            pk[j].num=pk[j+1].num;
            pk[j].size[top[j]]=pk[j+1].size[top[j]];
            pk[j].suit[top[j]]=pk[j+1].suit[top[j]];
        }
    pk[j].size[top[j]]='\0';
    pk[j].suit[top[j]]='\0';
    pk[j].num='\0';}
}
int judge()
{
    int i,j,k,len=52,len1=52;
    for(i=0; i<len; i++)
        top[i]=0;
    for(i=0; i<len; i++)
    {
        if(i>2&&pk[i].suit==pk[i-3].suit||pk[i].size==pk[i-3].size)
        {
            len--;
            three(i,len);
            i=0;
        }
        if(i>0&&(pk[i].suit==pk[i-1].suit||pk[i].size==pk[i-1].size))
        {
            len--;
            one(i,len);
            i=0;
        }


    }
    //for(i=0; i<len; i++)
    //printf("%c%c,",pk[i].size,pk[i].suit);
    if(len!=1)
        printf("%d piles remaining:",len);
    else
        printf("%d pile remaining:",len);
    for(i=0; i<len; i++)
        printf(" %d",pk[i].num);
    printf("\n");
}


int main()
{
    int i,j,k;
    while(gets(a[0]))
    {
        if(a[0][0]=='#')break;
        gets(a[1]);
        strcpy(p,a[0]);
        strcat(p,a[1]);
        for(i=0,j=0; i<strlen(p); i++)
            if(isalpha(p[i])||isdigit(p[i]))
                p[j++]=p[i];
        p[j]='\0';
        for(i=0,j=0; i<strlen(p); i+=2)
        {
            pk[j].num=1;
            pk[j].size[0]=p[i];
            pk[j++].suit[0]=p[i+1];
        }
        judge();
        memset(a,0,sizeof(a));
        memset(pk,0,sizeof(pk));
        memset(p,0,sizeof(p));
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值