这题其实挺简单的,可是自己一开始题目没看懂,或者说题目理解不清,导致结果总是不对,花了不少时间。后来细细地读题,认认真真地读题,终于理解了,自己的英语能力真的不行啊。题目意思是每次都是移动最上面的那个,我一开始认为是把一堆一起移动。
中途调试的时候,写了几条测试语句,最后交的时候忘记注释掉了,结果老是WA,光查找这个就花了不少时间
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
char card[52][2];
int num[52],top,idx[52][52];//这里真的有点坑,我一开始定义为index,结果说编译错误。
void judge(int id,int &fst,int &thd)
{
int a=idx[id][num[id]],b,c;
if(id-1>=0)
b=idx[id-1][num[id-1]];
if(id-3>=0)
c=idx[id-3][num[id-3]];
if(id-1>=0&&((card[b][0]==card[a][0])||(card[b][1]==card[a][1])))
fst=id-1;
if(id-3>=0&&((card[c][0]==card[a][0])||(card[c][1]==card[a][1])))
thd=id-3;
}
void gap(int id)//消除间隔
{
for(int i=id;i<top-1;i++)
{
int a=i+1;
for(int j=0;j<=num[a];j++)
idx[i][j]=idx[a][j];
num[i]=num[a];
}
top--;
}
void mov()
{
for(int i=1;i<top;i++)
{
int fst=-1,thd=-1;
judge(i,fst,thd);
if(fst==-1&&thd==-1)
continue;
if(fst!=-1&&thd==-1)
{
num[fst]++;
idx[fst][num[fst]]=idx[i][num[i]];
num[i]--;
if(num[i]==-1)//说明存在间隔
gap(i);
i=0;
}
else if(thd!=-1)
{
num[thd]++;
idx[thd][num[thd]]=idx[i][num[i]];
num[i]--;
if(num[i]==-1)
gap(i);
i=0;
}
}
}
int main()
{
while(true)
{
scanf("%s",card[0]);
if(card[0][0]=='#')
break;
for(int i=1;i<52;i++)
scanf("%s",card[i]);
fill(num,num+52,0);
memset(idx,0,sizeof(idx));
for(int i=0;i<52;i++)
idx[i][0]=i;
top=52;
mov();
if(top==1)
printf("1 pile remaining:");
if(top>1)
printf("%d piles remaining:",top);
for(int i=0;i<top;i++)
printf(" %d",num[i]+1);
printf("\n");
}
return 0;
}