这题首先题意很难理解,搞了好久才基本上搞明白,然后又想怎么去敲代码,起初想的就是vector套个stack,
但是写着写着写残了,就换了vector数组的写法,写了一会发现又残了,重新回头写vetocr套stack,竟然想通了,
果断AC一发。卡时间过的,毕竟vector套栈,比较费时间。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<cctype>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
#define LL __int64
using namespace std;
vector< stack<string> > v;
bool is_match(string s,string ss)
{
if(s[0]==ss[0]||s[1]==ss[1])
return 1;
return 0;
}
int main()
{
string ss;
stack<string> cc;
while(cin>>ss&&ss[0]!='#')
{
v.clear();
// cout<<ss<<' ';
stack<string> cc;
cc.push(ss);
v.push_back(cc);
for(int i=1;i<52;i++)
{
stack<string> cc;
cin>>ss;
cc.push(ss);
v.push_back(cc);
}
while(1)
{
int i;
for(i=0;i<(int)v.size();i++)
{
if(i>=3&&is_match(v[i].top(),v[i-3].top()))
{
v[i-3].push(v[i].top());
v[i].pop();
break;
}
if(i>=1&&is_match(v[i].top(),v[i-1].top()))
{
v[i-1].push(v[i].top());
v[i].pop();
break;
}
}
if(i==(int)v.size()) break;
if(v[i].empty())
{
v.erase(v.begin()+i);
}
}
if((int)v.size()==1)
printf("1 pile remaining:");
else
printf("%d piles remaining:",v.size());
for(int i=0;i<(int)v.size();i++)
{
if(!v[i].empty())
cout<<' '<<v[i].size();
}
cout<<endl;
}
return 0;
}