说说:
这道题难度其实并不但,但是比较繁琐,且细节容易被忽略。先分析一下游戏规则吧,知道游戏规则之后,问题自然而然就解决了。首先放着一行52个扑克牌堆(ps:输入的时候分两行输入)开始每堆只有一张牌,然后从左到右开始判断,若一张牌和左边第一张牌或者左边第三张牌的大小或者花色相同,则将该张牌放到那一对牌之上并且要求继续向左匹配,直到不能匹配为止。若某个堆一张牌都不剩了,则该堆不存在了,也就是说如果两堆相邻,则两堆的牌数都不能为0.最后按照这个规则,直到没有牌能够移动位置。(ps:移动是指顶层牌的移动而不是整个堆的移动)。具体的解题步骤,看代码就好=v=
源代码:
#include <stdio.h>
#include <string.h>
int main(){
int i,j,pos,pos1,count;
char s[52][52][3];//保存每个堆
char c,move;
int num[52];
// freopen("data","r",stdin);
while(1){
if((c=getchar())=='#')
break;
else
ungetc(c,stdin);
for(i=0;i<52;i++){
scanf("%s",s[i][0]);
num[i]=1;
}
while(1){
move=0;
for(i=1;i<52;i++){
if(num[i]==0||i==0)//忽略牌数为0的堆
continue;
j=0;
pos1=i-1;
while(j!=3&&pos1>=0){//找到相邻的堆,若存在的话
if(num[pos1]>0){
j++;
break;
}
pos1--;
}
pos=pos1-1;
while(j!=3&&pos>=0){//找到间隔的第三个堆,若存在的话
if(num[pos]>0)
j++;
pos--;
}
pos++;
//匹配
if(j==3&&(s[pos][num[pos]-1][0]==s[i][num[i]-1][0]||s[pos][num[pos]-1][1]==s[i][num[i]-1][1])){
strcpy(s[pos][num[pos]],s[i][num[i]-1]);
num[pos]++;
num[i]--;
i=pos-1;
move=1;
}
else if(j>=1&&(s[i][num[i]-1][0]==s[pos1][num[pos1]-1][0]||s[i][num[i]-1][1]==s[pos1][num[pos1]-1][1])){
strcpy(s[pos1][num[pos1]],s[i][num[i]-1]);
num[i]--;
num[pos1]++;
i=pos1-1;
move=1;
}
}
if(move==0) break;//若一个循环下来没有一次移动,则结束匹配
}
count=0;
for(i=0;i<52;i++)
if(num[i]>0)
count++;
if(count!=1)
printf("%d piles remaining:",count);
else
printf("1 pile remaining:");//注意当仅剩一个堆的特殊输出情况
for(i=0;i<52;i++)
if(num[i]>0)
printf(" %d",num[i]);
putchar('\n');
while(getchar()!='\n');
}
return 0;
}
``Accordian'' Patience UVA 127
原文地址:http://blog.csdn.net/u011915301/article/details/38986023