题意:
将牌依次分成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;
}