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