SDUST_OJ-1069-模拟一种扑克牌游戏-AC

这个题主要在看懂题,尤其是这一句:“一旦出现任何一张牌与它左边的第一张或第三张“匹配””,其意思是与左边第一叠牌或第三叠牌,不是左边第一叠的第一张或第三张。

读懂题之后,按照题意模拟就可以了,不过在跑得时候要注意是从左往右找,而不是从右往左找,两种结果是不一样的。

AC代码:

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

struct datapai
{
    char n;//牌值
    char co;//牌色
};

struct datadie
{
    int su;//此叠牌数
    struct datapai pai[60];
};

int main()
{
    struct datadie die[60];//左起第几叠
    int i,j,k,l;
    while(1)
    {
        for (i=0;i<52;i++)
        {
            scanf("%c%c",&die[i].pai[0].n,&die[i].pai[0].co);
            if (die[i].pai[0].n=='#') return 0;
            getchar();
            die[i].su=0;
        }
        die[52].su=-1;
        for (i=0;i<60;i++)
        {
            die[52].pai[i].co='?';
            die[52].pai[i].n='?';
        }
        die[54]=die[53]=die[52];
/*for (i=0;i<55;i++)
{
    printf("%d: %d %c%c\n",i,die[i].su,die[i].pai[0].n,die[i].pai[0].co);
}*/
        int maxi=51;
        x0:
        for (i=0;i<=maxi;i++)
        {
            if (i>=3)
            {
                //printf("%c %c\n",die[i].pai[die[i].su].co,die[i-3].pai[die[i-3].su].co);
                if(die[i].pai[die[i].su].n==die[i-3].pai[die[i-3].su].n||die[i].pai[die[i].su].co==die[i-3].pai[die[i-3].su].co)//与左边第3张匹配
                {
                    die[i-3].su++;
                    die[i-3].pai[die[i-3].su]=die[i].pai[die[i].su];
                    die[i].su--;
                    if (die[i].su==-1)//i叠没牌了
                    {

                        //die[i].su=0;
                        for(j=i;j<=maxi;j++)//整体前移
                        {
                            die[j]=die[j+1];
                            if (die[j+1].su==-1)
                                break;
                           // die[j+1].su=-1;
                        }
                        maxi--;
                    }
                   /* for (i=0;i<55;i++)
                    {
                        printf("1:%d: %d %c%c\n",i,die[i].su,die[i].pai[die[i].su].n,die[i].pai[die[i].su].co);
                    }*/
                    //system("pause");
                    goto x0;
                }
            }

            if (i>0)
            {
                if(die[i].pai[die[i].su].n==die[i-1].pai[die[i-1].su].n||die[i].pai[die[i].su].co==die[i-1].pai[die[i-1].su].co)//与左边第3张匹配
                {
                    die[i-1].su++;
                    die[i-1].pai[die[i-1].su]=die[i].pai[die[i].su];
                    die[i].su--;
                    if (die[i].su==-1)//i叠没牌了
                    {

                        //die[i].su=0;
                        for(j=i;j<=maxi;j++)//整体前移
                        {
                            die[j]=die[j+1];
                            if (die[j+1].su==-1)
                                break;
                           // die[j+1].su=-1;
                        }
                        maxi--;
                    }
                   /* for (i=0;i<55;i++)
                    {
                        printf("2:%d: %d %c%c\n",i,die[i].su,die[i].pai[die[i].su].n,die[i].pai[die[i].su].co);
                    }*/
                    //system("pause");
                    goto x0;
                }
            }
        }
        //printf("%d\n",maxi);
        if (maxi==0)
            printf("1 pile remaining: 52\n");
        else
        {
            printf("%d piles remaining:",maxi+1);
            for (i=0;i<=maxi;i++)
                printf(" %d",die[i].su+1);
            printf("\n");
        }

    }
        return 0;
}


 

你可能感兴趣的:(SDUST_OJ-1069-模拟一种扑克牌游戏-AC)