//栈的模型,后进先出
//题不是很难,关键涉及什么数据结构要想清楚
//细节处理,考虑全
#include <iostream>
#include <sstream>
#include <cstdio>
#include <string>
#include <cstring>
using namespace std;
int len;
typedef struct{
char face_value;
char suit;
}Card;
struct Rank{
Card cards[55];
int top;
}ranks[55];
void mov(int n)
{
for(;n<len;n++)
ranks[n]=ranks[n+1];
}
int isSame(int x,int y)
{
if(ranks[x].cards[ranks[x].top].face_value==ranks[y].cards[ranks[y].top].face_value
|| ranks[x].cards[ranks[x].top].suit==ranks[y].cards[ranks[y].top].suit)
return 1;
else
return 0;
}
int handle(int n)
{
if(n>=len)
return 0;
int k=n;
while(k>0)
{
if(k>=3 && isSame(k-3,n))
k=k-3;
else if(k>=1 && isSame(k-1,n))
k=k-1;
else break;
}
if(k!=n)
{
ranks[k].cards[++ranks[k].top]=ranks[n].cards[ranks[n].top--];
if(ranks[n].top==-1)
{
mov(n);
len--;
}
//handle(k+1);
//handle(k+3);
return 1;
}
return 0;
}
int main()
{
//freopen("127.in","r",stdin);
//freopen("127.out","w",stdout);
string line;
while(getline(cin,line) && line!="#")
{
memset(ranks,0,sizeof(ranks));
len=52;
int u=0;
istringstream in(line);
string a;
while(in>>a)
{
ranks[u].cards[0].face_value=a[0];
ranks[u].cards[0].suit=a[1];
u++;
}
getline(cin,line);
istringstream in2(line);
while(in2>>a)
{
ranks[u].cards[0].face_value=a[0];
ranks[u].cards[0].suit=a[1];
u++;
}
int flag=1;
while(flag==1)
{
flag=0;
for(int i=0;i<len;i++)
{
if(handle(i))
{
flag=1;
break;
}
}
}
printf("%d ",len);
if(len==1)
printf("pile remaining:");
else
printf("piles remaining:");
for(int i=0;i<len;i++)
printf(" %d",ranks[i].top+1);
printf("\n");
}
return 0;
}
//stl实现
#include <iostream>
#include <sstream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stack>
using namespace std;
int len;
struct Card{
char face_value;
char suit;
Card(char a,char b):face_value(a),suit(b){}
};
stack<Card> ranks[55];
void mov(int n)
{
for(;n<len-1;n++)
ranks[n]=ranks[n+1];
}
int isSame(int x,int y)
{
if(ranks[x].top().face_value==ranks[y].top().face_value ||
ranks[x].top().suit==ranks[y].top().suit)
return 1;
else
return 0;
}
int handle(int n)
{
if(n>=len)
return 0;
int k=n;
while(k>0)
{
if(k>=3 && isSame(k-3,n))
k=k-3;
else if(k>=1 && isSame(k-1,n))
k=k-1;
else break;
}
if(k!=n)
{
ranks[k].push(ranks[n].top());
ranks[n].pop();
if(ranks[n].empty())
{
mov(n);
len--;
}
return 1;
}
return 0;
}
int main()
{
freopen("127.in","r",stdin);
//freopen("127.out","w",stdout);
string line;
while(getline(cin,line) && line!="#")
{
//memset(ranks,0,sizeof(ranks));
len=52;
int u=0;
istringstream in(line);
string a;
while(in>>a)
{
ranks[u].push(Card(a[0],a[1]));
u++;
}
getline(cin,line);
istringstream in2(line);
while(in2>>a)
{
ranks[u].push(Card(a[0],a[1]));
u++;
}
int flag=1;
while(flag==1)
{
flag=0;
for(int i=0;i<len;i++)
{
if(handle(i))
{
flag=1;
break;
}
}
}
printf("%d ",len);
if(len==1)
printf("pile remaining:");
else
printf("piles remaining:");
for(int i=0;i<len;i++)
printf(" %d",ranks[i].size());
printf("\n");
for(int i=0;i<55;i++)
while(!ranks[i].empty())
ranks[i].pop();
}
return 0;
}