题目
纸牌游戏
分析
- I wanna play a game.
- 每组测试数据给出52张牌,牌的信息包括花色(
suit
)和数字(rank
); - 规则是这样,每发一张牌,如果它左边
第三摞牌
顶牌的花色或数字与当前牌相同,那么把这张牌放到它左边第三摞牌
的上面;如果不匹配再判断它与左边第一摞牌
顶牌的花色或数字是否相同,如果相同把这张牌放到它左边第一摞牌
的上面; - 同时再瞅瞅有没有可以堆叠的,直到不能再堆叠,输出每摞叠了几张(>0)。
思路
- 并没有使用
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;
}