模拟+栈
注意开结构体的技巧
#include<iostream>
using namespace std;
struct card{
char a[53][3]; //记录每堆的扑克信息
int top; //记录该堆栈顶位置
}cc[53]; //记录每堆牌
void change(int loc,int dis) //从左往右数,loc位置的顶堆牌放在loc-dis的位置上
{
cc[loc-dis].top++;
for(int i=0;i<2;i++)
{
cc[loc-dis].a[cc[loc-dis].top][i]=cc[loc].a[cc[loc].top][i];
}
cc[loc].top--;
if(cc[loc].top==-1) //如果只有一张卡片,则删除
{
for(int j=loc;j<=51;j++)
{
cc[j]=cc[j+1];
}
}
}
int main()
{
while(1)
{
cin>>cc[0].a[0];
cc[0].top=0;
if(cc[0].a[0][0]=='#')
break;
for(int i=1;i<=51;i++)
{
cin>>cc[i].a[0];
cc[i].top=0;
}
cc[52].top=-1;
int j=0;
int over;
while(1)
{
over=1;
for(;cc[j].top!=-1;j++)
{
if(j-3>=0&&(cc[j].a[cc[j].top][0]==cc[j-3].a[cc[j-3].top][0]||cc[j].a[cc[j].top][1]==cc[j-3].a[cc[j-3].top][1]))
{
over=0;
change(j,3);
j=j-3;
break;
}
if(j-1>=0&&(cc[j].a[cc[j].top][0]==cc[j-1].a[cc[j-1].top][0]||cc[j].a[cc[j].top][1]==cc[j-1].a[cc[j-1].top][1]))
{
over=0;
change(j,1);
j=j-1;
break;
}
}
if(over==1)
break;
}
int m;
for( m=0;cc[m].top!=-1;m++)
{
}
printf("%d piles remaining:",m);
for(int i=0;i<m;i++)
{
cout<<" "<<cc[i].top+1;
}
cout<<endl;
}
return 0;
}