UVA 127 ``Accordian'' Patience

题目

纸牌游戏

分析

  1. I wanna play a game.
  2. 每组测试数据给出52张牌,牌的信息包括花色(suit)和数字(rank);
  3. 规则是这样,每发一张牌,如果它左边第三摞牌顶牌的花色或数字与当前牌相同,那么把这张牌放到它左边第三摞牌的上面;如果不匹配再判断它与左边第一摞牌顶牌的花色或数字是否相同,如果相同把这张牌放到它左边第一摞牌的上面;
  4. 同时再瞅瞅有没有可以堆叠的,直到不能再堆叠,输出每摞叠了几张(>0)。

思路

  1. 并没有使用STL,于是开52个栈,每个栈容量52张,每张保存花色和数字两个值用数组来摆([52][52][2]);

代码

#include <cstdio>
#include <cstring>
#define N 52

char pile[N+1][N+1][2];
int top[N+1];

int main(void) {
    while (scanf("%s", pile[0][0]) && pile[0][0][0] != '#') {
        for (int i = 1; i < N; i++)
            scanf("%s", &pile[i][0]);
        memset(top, 0, sizeof(top));
        int n = N;
        for (int i = 1; i < n; i++) {
            bool flag = true;
            if (i > 2) {
                if (pile[i][top[i]][0] == pile[i-3][top[i-3]][0] ||
                    pile[i][top[i]][1] == pile[i-3][top[i-3]][1]) {
                    top[i-3]++;
                    pile[i-3][top[i-3]][0] = pile[i][top[i]][0];
                    pile[i-3][top[i-3]][1] = pile[i][top[i]][1];
                    top[i]--;
                    flag = false;
                }
            }
            if (flag) {
                if (pile[i][top[i]][0] == pile[i-1][top[i-1]][0] ||
                    pile[i][top[i]][1] == pile[i-1][top[i-1]][1]) {
                    top[i-1]++;
                    pile[i-1][top[i-1]][0] = pile[i][top[i]][0];
                    pile[i-1][top[i-1]][1] = pile[i][top[i]][1];
                    top[i]--;
                    flag = false;
                }
            }
            if (top[i] < 0) {
                for (int j = i; j < n; j++) {
                    for (int k = 0; k <= top[j+1]; k++) {
                        pile[j][k][0] = pile[j+1][k][0];
                        pile[j][k][1] = pile[j+1][k][1];
                    }
                    top[j] = top[j+1];
                }
                n--;
                i = 0;
                continue;
            }
            if (!flag) {
                i = 0;
                continue;
            }
        }
        printf("%d %s remaining:", n, (n == 1)? "pile": "piles");
        for (int i = 0; i < n; i++) {
            printf(" %d", top[i]+1);
        }
        printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值