题解:设置52个栈数组,看左边第三个或左边第一个纸牌是否和自己在相同位置有同一样的字符,有的话就叠上去,左边第三个优先级更高,先每个栈存一张牌,然后遍历到可以移动的就放到对应的栈顶,如果当前栈已经为空,再将后边的栈向左边整体移动一位,最后一个栈清空,栈的数量减一,直到没有相同的可以移动,确定最后有多少栈留下,统计数量输出。
#include <cstdio>
#include <stack>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 55;
struct Card{
char a, b;
};
int judge(Card c1, Card c2) {
if (c1.a == c2.a || c1.b == c2.b)
return 1;
return 0;
}
int main() {
stack<Card> s[N];
Card card;
int n = 0, i;
while (scanf("%c%c", &card.a, &card.b) && card.a != '#') {
getchar();
s[n++].push(card);
if (n == 52) {
int m = 1;
int flag;
while (1) {
for (i = m; i < n; i++) {
if (i >= 3 && judge(s[i].top(), s[i - 3].top())) {
flag = 1;
break;
}
if (i >= 1 && judge(s[i].top(), s[i - 1].top())) {
flag = 2;
break;
}
}
if (i == n)
break;
if (flag == 1) {
s[i - 3].push(s[i].top());
m = i - 3;
}
else {
s[i - 1].push(s[i].top());
m = i - 1;
}
s[i].pop();
if (s[i].empty()) {
for (int j = i; j < n - 1; j++)
s[j] = s[j + 1];//注意到栈的等号有重载,清除原来的,再赋值进去
while (!s[n - 1].empty())
s[n - 1].pop();
n--;
}
}
if (n > 1)
printf("%d piles remaining:", n);
else
printf("%d pile remaining:", n);
for (int i = 0; i < n; i++) {
printf(" %d", s[i].size());
while (!s[i].empty())
s[i].pop();
}
printf("\n");
n = 0;
}
}
return 0;
}