首页 > 代码库 > ``Accordian'' Patience UVA 127

``Accordian'' Patience UVA 127

说说:

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