UVa 127 - "Accordian" Patience

题目: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("\n");

	}

	return 0;

}

 

 

 

你可能感兴趣的:(uva)