题目:52张扑克,从左到右在平面上排列,按着如下规则处理:
1.按照从左到右的顺序,如果一张牌和左边的第一张或者第三张匹配,就把它放到对应的牌上面。
2.如果可以移动到多个位置,移动到最左端的牌上面。(匹配:花色或者数值相同)
分析:数据结构、栈、模拟。对于每叠牌建立一个栈,进行模拟即可。
注意:每次只移动每叠牌的最顶上的牌。
#include <iostream> #include <cstdlib> #include <cstdio> using namespace std; char Card[54][54][3]; int Top[54]; int Sum;//记录合并的叠数 int match( char* a, char *b ) { return (a[0] == b[0] || a[1] == b[1]); } int deal( int now, int s ) { //判断是否能移动s步长 int count = 0,temp = now; while ( temp >= 0 && count < s ) if ( Top[-- temp] >= 0 ) count ++; //判断是否匹配 if ( temp >= 0 && match( Card[now][Top[now]], Card[temp][Top[temp]] ) ) { Top[temp] ++; Card[temp][Top[temp]][0] = Card[now][Top[now]][0]; Card[temp][Top[temp]][1] = Card[now][Top[now]][1]; if ( -- Top[now] < 0 ) Sum ++; return temp; }else return -1; } int main() { while ( scanf("%s",Card[0][0]) && Card[0][0][0] != '#' ) { for ( int i = 1 ; i < 52 ; ++ i ) scanf("%s",Card[i][0]); for ( int i = 0 ; i < 52 ; ++ i ) Top[i] = 0; Sum = 0; for ( int now = 1 ; now < 52 ; ) { while ( Top[now] < 0 ) now ++; //向左移动3步 int save = deal( now, 3 ); if ( save >= 0 ) now = save; else { //向左移动1步 save = deal( now, 1 ); if ( save >= 0 ) now = save; else now ++; } } printf("%d pile",52-Sum); if (51 > Sum) printf("s"); printf(" remaining:"); for ( int i = 0 ; i < 52 ; ++ i ) if ( Top[i] >= 0 ) printf(" %d",Top[i]+1); printf(" "); } return 0; }