题目大意:给出52张扑克,要求向左匹配,如果匹配到了就把该扑克放在最上面,问最后有几堆扑克,每堆有几张
解题思路:暴力匹配
#include<cstring>
#include<cstdio>
struct Card {
char c[52][2];
int number;
};
Card card[52];
int main() {
while(1) {
char mark;
int count = 52;
mark = getchar();
if(mark == '#')
break;
card[0].c[0][0] = mark;
card[0].c[0][1] = getchar();
card[0].number = 1;
getchar();
for(int i = 1; i < count; i++) {
card[i].c[0][0] = getchar();
card[i].c[0][1] = getchar();
getchar();
card[i].number = 1;
}
/* for(int i = 0 ; i < count; i++)
printf("%s ", card[i].c[0]);
*/
for(int i = 0; i < count; i++) {
if(i - 3 >= 0 && (card[i].c[card[i].number - 1][0] == card[i - 3].c[card[i-3].number-1][0] || card[i].c[card[i].number - 1][1] == card[i - 3].c[card[i-3].number-1][1]) ) {// 判断当前的左边的第三个是否同花色或者同数字
card[i - 3].c[card[i - 3].number][0] = card[i].c[card[i].number - 1][0];//将当前的数字赋值给左边第三个
card[i - 3].c[card[i - 3].number][1] = card[i].c[card[i].number - 1][1];//将当前的花色赋值给左边的第三个
card[i-3].number++;
card[i].number--;//移走一位相对减1
if(card[i].number == 0) {
for(int j = i; j < count; j++)
card[j] = card[j+1];//如果当前的以为空,则向左移,并且count--;
count--;
}
i = -1;
}
if(i - 1 >= 0 && (card[i].c[card[i].number - 1][0] == card[i - 1].c[card[i-1].number-1][0] || card[i].c[card[i].number - 1][1] == card[i - 1].c[card[i-1].number-1][1]) ) {
card[i - 1].c[card[i - 1].number][0] = card[i].c[card[i].number - 1][0];
card[i - 1].c[card[i - 1].number][1] = card[i].c[card[i].number - 1][1];
card[i-1].number++;
card[i].number--;
if(card[i].number == 0) {
for(int j = i; j < count; j++)
card[j] = card[j+1];
count--;
}
i = -1;
}// 判断当前的和左边三个是否相同
}
printf("%d pile%s remaining: ",count, count != 1? "s":"");
for(int i = 0; i < count; i++) {
printf("%d",card[i].number);
if(i != count - 1)
printf(" ");
else
printf("\n");
}
}
/*
for(int i = 0 ; i < count; i++) {
for(int j = 0; j < card[i].number; j++)
printf("%s", card[i].c[j]);
printf("\n");
}
*/
return 0;
}