UVa 127

题目: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;
}
原文地址:https://www.cnblogs.com/keanuyaoo/p/3364585.html