说说:
这道题难度其实并不但,但是比较繁琐,且细节容易被忽略。先分析一下游戏规则吧,知道游戏规则之后,问题自然而然就解决了。首先放着一行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
时间: 2024-10-25 08:30:19