UVA 127 Accordian'' Patience

来源:互联网 发布:淘宝网龙布峰针贴 编辑:程序博客网 时间:2024/05/20 04:29

题意:把一堆扑克牌,按照规则:如果左边1张或3张和它具有同花色或等级,把这张牌移到上面去,每次移动后,在从头开始移动,知道都移动完,输出剩余几堆与每堆牌数,如果1张牌有2个可以移动的地方,优先移动到左3位置。
思路:用结构体存每一张牌,用栈来储存牌堆,每次判断能不能移动牌,每次移动后进行一次变换

<span style="font-size:18px;">#include <stdio.h>#include <string.h>struct pai{    char value;    char suit;} pai[52];int num_dui;int stack[52][52];//这是存每个堆上的牌顺序int num[52];//存每个堆的牌的数量int judge;void traa(int n){    for (int i = n; i < num_dui - 1; i ++)    {for(int j = 0; j < 52; j ++){    stack[i][j] = stack[i + 1][j];}num[i] = num[i + 1];    }    num_dui--;}void tra(int a, int b){    stack[b][num[b]] = stack[a][num[a] - 1];    stack[a][num[a] - 1] = -1;    num[a] --;    num[b] ++;    if (num[a] == 0)    {traa(a);    }}int find(){    for (int i = 1; i < num_dui; i ++)    {if (i >= 3 && (pai[stack[i - 3][num[i - 3] - 1]].suit == pai[stack[i][num[i] - 1]].suit || pai[stack[i - 3][num[i - 3] - 1]].value == pai[stack[i][num[i] - 1]].value)){    judge = 1;    tra(i , i - 3);    break;}    if(pai[stack[i - 1][num[i - 1] - 1]].suit == pai[stack[i][num[i] - 1]].suit || pai[stack[i - 1][num[i - 1] - 1]].value == pai[stack[i][num[i] - 1]].value){    judge = 1;    tra(i, i - 1);    break;}    }    return judge;}int main(){    while (scanf("%c%c%*c", &pai[0].value, &pai[0].suit) != EOF && pai[0].value != '#')    {memset(num, 0 ,sizeof(num));for (int i = 0; i < 52; i ++)    for (int j = 0; j < 52; j ++)stack[i][j] = -1;stack[0][0] = 0;num_dui = 52;num[0] = 1;judge = 1;for (int i = 1 ; i < 52; i ++){    scanf("%c%c%*c", &pai[i].value, &pai[i].suit);    stack[i][0] = i;    num[i] = 1;}while (judge){    judge = 0;    find();}if (num_dui != 1){    printf("%d piles remaining:", num_dui);    for (int i = 0; i < num_dui; i ++)printf(" %d", num[i]);    printf("\n");}else{    printf("%d pile remaining:", num_dui);    for (int i = 0; i < num_dui; i ++)printf(" %d", num[i]);    printf("\n");}    }    return 0;}</span>


0 0