UVA 170 Clock Patience

38 篇文章 0 订阅

这里写图片描述
这里写图片描述

题意:
将牌依次分成13堆,牌面朝下,按从1到13的顺序发牌,然后从第K堆第一张开始翻牌,然后将该牌放在这一堆的最下面,面朝上,接着翻牌面上显示的数字那一堆的第一张面朝下的牌,重复此过程,直到所有牌都面朝上,输出翻牌的次数以及最后一次翻的牌
思路:
用队列数组保存13堆牌,用结构体存储每张牌的面值、花色、面朝上/朝下,然后模拟翻牌过程


#include <iostream>
#include <queue>
using namespace std;
int times;
struct Card
{
    char value;//面值
    char suit;//花色
    bool faceDown;//牌面状态,朝上/朝下
    int transfer()
    {
        switch(value)//将字符转为整数
        {
            case'A':
                return 1;
            case'T':
                return 10;
            case'J':
                return 11;
            case'Q':
                return 12;
            case'K':
                return 13;
            default:
                return value-'0';
        }
    }

};
queue<Card>quePile[13];//声明一个队列数组,每堆牌用一个队列储存
Card lastCard;//记录最后一张牌的状态
void initial()
{
    for(int i=0;i<13;i++)
    {
        while(!quePile[i].empty())
            quePile[i].pop();
    }
}
void read(char c)
{
    Card card;
    for(int r=0;r<4;r++)
    {
        for(int l=0;l<13;l++)
        {
            if(r==0&&l==0)//第一张特殊讨论
            {
                card.value=c;
                cin>>card.suit;
            }
            else
                cin>>card.value>>card.suit;
            card.faceDown=true;//初始化为向下
            quePile[12-l].push(card);//注意,输入的牌顺序是倒着的(即输入样例中3C是发的第一张牌),因此倒序存入队列数组
        }
    }
}
void playCard()
{
    int i;
    times=0;//记录翻牌次数
    i=12;//记录翻牌的堆数
    while(quePile[i].front().faceDown)//若面朝下
    {
        lastCard=quePile[i].front();
        lastCard.faceDown=false;//翻开,即面朝上
        quePile[i].pop();
        i=lastCard.transfer()-1;//得出下一次从第几堆翻牌
        times++;
        quePile[i].push(lastCard);//将翻开的牌放在该堆的最下面
    }
}
void result()
{
    cout<<times/10<<times%10<<','<<lastCard.value<<lastCard.suit<<endl;//不足10次要用0补齐两位
}
int main()
{
    char ch;
    while(cin>>ch&&ch!='#')
    {
        initial();
        read(ch);
        playCard();
        result();
    }


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值