纸牌游戏--线性表

题目:

给一副扑克牌,给出牌的大小和花色,按照从左往右摆,可以产生匹配,要求是只要花色相同或是大小相同,并且要求如果某张牌跟左边相邻的那张匹配,且与从该牌左边数第三张牌匹配,则遵循跟第三张牌匹配,匹配后将该牌叠加在第三张牌上;如果有两张牌都能进行匹配,则遵循依次从左往右的顺序。问到最后还剩几堆牌?

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
struct card
{
    char value;
    char suit;
};
bool compare(card a,card b)
{
    if(a.value==b.value||a.suit==b.suit)
        return true;
    else
        return false;
}
int main()
{
    char temp[2];               //缓存输入
    vector<stack<card> >piles;  //建立vector的数据类型
    piles.clear();
    while(scanf("%s",temp)!=EOF&&temp[0]!='#')
    {
        card tmp;
        stack<card>s;
        tmp.value=temp[0];
        tmp.suit=temp[1];
        s.push(tmp);            //将卡牌信息存入栈中
        piles.push_back(s);     //将栈加在piles这个vector后边
        for(int i=1;i<52;i++)
        {
            scanf("%s",temp);
            tmp.value=temp[0];
            tmp.suit=temp[1];
            while(!s.empty())   //需要把栈给清空
                s.pop();
            s.push(tmp);
            piles.push_back(s); //将栈放入vector
        }
        while(true)             //制造循环
        {
            int i;
            for(i=0;i!=piles.size();i++)
            {
                if(i>2&&compare(piles[i].top(),piles[i-3].top()))   //实现左边第三个匹配
                {
                    piles[i-3].push(piles[i].top()); //将第i个元素压入第i-3个元素的栈中
                    piles[i].pop();                  //将第i个栈中元素跳出
                    break;
                }
                if(i>=1&&compare(piles[i].top(),piles[i-1].top()))  //实现左边相邻匹配
                {
                    piles[i-1].push(piles[i].top()); 
                    piles[i].pop();
                    break;
                }
            }
            if(i==piles.size())         //如果全部遍历一遍,结束
            {
                break;
            }
            else
            {
                if(piles[i].empty())    //如果vector中第i个栈为空
                {
                    piles.erase(piles.begin()+i);   //清除第i+1个栈元素
                }
            }
        }
        if(piles.size()==1)             //如果vector中只有一个栈元素
        {
            printf("1 pile remaining: 52\n");
        }
        else                            //将vector中剩下的栈中元素个数输出
        {
            printf("%d piles remaining:",piles.size());
            for(int i=0;i!=piles.size();i++)
            {
                printf(" %d",piles[i].size());
            }
            printf("\n");
        }
        piles.clear();                  //将vector清空
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值