``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

时间: 2024-10-25 08:30:19

``Accordian'' Patience UVA 127的相关文章

&quot;Accordian&quot; Patience UVA 127 (”手风琴“牌游戏)

"Accordian" Patience From:UVA, 127 Submit Time Limit: 3000 MS You are to simulate the playing of games of ``Accordian'' patience, the rules for which are as follows: Deal cards one by one in a row from left to right, not overlapping. Whenever th

&quot;Accordian&quot; Patience (UVa 127) 双向链表 栈

题目:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=63 思路: 从第一个牌堆开始,向右进行遍历.若存在左边第三个牌堆,则优先考虑能否移动到左边第三个牌堆,若不存在或不能移动,再考虑左边第一个牌堆,若都不能移动,则继续考虑下一个牌堆.由于"如果有多张牌可以移动,先移动最左边的牌",因此进行移动操作以后,要从移动到的那张

UVa OJ 127 - &quot;Accordian&quot; Patience (“手风琴”纸牌)

UVa OJ 127 - "Accordian" Patience ("手风琴"纸牌) Time limit: 3.000 seconds 限时:3.000秒 Problem 问题 You are to simulate the playing of games of "Accordian" patience, the rules for which are as follows: 模拟玩一个"手风琴"纸牌游戏,规则如下: D

uva 127 &quot;Accordian&quot; Patience(手风琴纸牌)

用 栈 stack 来处理. 直接根据题目描述写就可以.不要忘记每组数据最后的清空栈堆. 题目大意: 给定52张的扑克牌,现在要求对扑克牌进行整理,对于每一张扑克牌,如果左边的第三张存在那么就去判断这一张是否和第三张满足花色或卡片值相同,如果满足则把这一张移动到左边的第三张,否则去判断左边的第一张是否和这一张满足条件:如果左边的第三张不存在那么只要去判断左边的第一张即可.最后输出剩下的扑克牌的堆数,并且输出每一堆的牌数. #include<stdio.h> #include<iostre

Uva 127 poj 1214 `Accordian&#39;&#39; Patience

 ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patience, the rules for which are as follows: Deal cards one by one in a row from left to right, not overlapping. Whenever the card matches its immediate neighbour on

UVa 127 - &quot;Accordian&quot; Patience POJ 1214 链表题解

UVa和POJ都有这道题. 不同的是UVa要求区分单复数,而POJ不要求. 使用STL做会比较简单,这里纯粹使用指针做了,非常麻烦的指针操作,一不小心就错.调试起来还是非常费力的 本题理解起来也是挺费力的,要搞清楚如何模拟也不容易啊,读题要很仔细. 纯指针的操作挺快的吧.不过POJ 0ms,而UVa就0.2左右了. 三相链表: 1 只要有叠起来的牌,那么就使用一个down指针指向下面的牌就可以了. 2 使用双向链表,可以方便前后遍历. 3 记得有了更新牌之后,又要重新开始检查是否需要更新牌,这是

ACM学习历程——UVA 127 &quot;Accordian&quot; Patience(栈;模拟)

Description  ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patience, the rules for which are as follows: Deal cards one by one in a row from left to right, not overlapping. Whenever the card matches its immediate n

uva ``Accordian&#39;&#39; Patience

题目如下: ``Accordian'' Patience You are to simulate the playing of games of ``Accordian'' patience, the rules for which are as follows: Deal cards one by one in a row from left to right, not overlapping. Whenever the card matches its immediate neighbour

``Accordian&#39;&#39; Patience

终于解决了一个忧伤好久的问题,严重拖了项目进度,深感惭愧!一直被一系列的问题所困扰,然后又只能自己一个人摸索,也是一段辛酸忧伤史,现在小结一下上个月在做二维码的过程中所碰到的问题以及解决办法,现在庆幸终于解决好了,终于能将这个功能告一段落,一下小结也是分享一下Unity的某些"坑",让同行少走弯路,起码在二维码这方面应该会有所启迪,欣慰的是接下来几天终于可以做自己应该做的事情了! 效果图: 先小结一下碰到的问题: 1.Unity工程屏幕方向与Android工程屏幕方向要一致的问题 本来