uva 127

题目:(摘自星星之火的百度空间)

你的任务是模拟一种叫「Accordian」的纸牌游戏,他的游戏规则如下:

一副扑克牌有52张牌,首先把纸牌一张一张由左到右排好(不能有重叠,所以共有52堆牌,每堆一张),当某一张牌与他左边那张牌或者左边的第三张牌有「Match」的时候,就把这张牌移到那张牌上面去。在这里两张牌「Match」指的是这两张牌的花色(suit)或者点数(rank)一样。当你做了一个移动之后,要察看是否还可以做其他的移动。在任何时间,只有最上面那张牌可以被移动。如果因为移动一张牌使得产生一个空格(也就是被移动的那堆牌只有一张牌),你必须把右边所有的牌堆往左移一格。如此不断的寻找可移动的牌,直到没有一张牌可以移动游戏就结束了。

在选择可以移动的牌的时候可能有些状况会发生。如果有两张牌都可以移动,你应该要移动最左边的那张牌。当一张牌可以被移动到左边一格,或左边三格的时候,你必须移动到左边三格。

Input

输入包含多组测试资料。每组测试资料两列,每列有26张牌的资料。每张牌以2个字元代表。第一个字元代表牌的点数(A=Ace, 2~9, T=10, J=Jack, Q=Queen, K=King),第二个字元代表牌的花色(C=Clubs, D =Diamonds, H=Hearts, S=Spades)

若遇到仅含#的一列代表输入结束。请参考Sample Input。

Output

对每组测试资料输出游戏结束时剩下几堆牌,以及每堆牌有多少张牌。请注意如果只有1堆牌,pile后没有加s,请参考Sample Output。

#include <cstdio>
#include <iostream>
#include <stack>
using namespace std;
int nSize ;
struct String
{
	char face[3];
};
struct Pile
{
	stack<String>face;
}arr[100];
int prev[100],next[100];
void DelGaps()
{
	int i,j;
	for( i = 0 ; i != nSize ; i=next[i])
	{
		if(arr[i].face.empty())
		{
			next[prev[i]] = next[i];
			prev[next[i]] = prev[i];
			return ;
		}
	}
}
bool Move()
{
	int cnt = 1;
	for(int i = next[0] ; i != nSize ; i = next[i],cnt++)
	{
		int last3,last1;
		if(cnt>2)
		{
			last3 = prev[prev[prev[i]]];
			if(arr[i].face.top().face[0]==arr[last3].face.top().face[0]
					||arr[i].face.top().face[1]==arr[last3].face.top().face[1])
					{
						arr[last3].face.push(arr[i].face.top());
						arr[i].face.pop();
						return true;
					}		
		}
		last1 = prev[i];
		 if(arr[i].face.top().face[0]==arr[last1].face.top().face[0]
				 ||arr[i].face.top().face[1]==arr[last1].face.top().face[1])
		{
			arr[last1].face.push(arr[i].face.top());
			arr[i].face.pop();
			return true;
		}
	}
	return false;;
}

void solve()
{
	while(Move())
		DelGaps();
}

int main()
{
	nSize = 0 ;
	String temp;
	while(scanf("%s",temp.face)!=EOF)
	{
		if(temp.face[0]=='#') break;
		while(!arr[nSize].face.empty())
			arr[nSize].face.pop();
		arr[nSize].face.push(temp);
		prev[nSize] = nSize - 1 ;
		next[nSize] = nSize + 1 ;
		nSize++;
		if(nSize == 52)
		{
			solve();
			int num = 0 ;
			for(int i = 0 ; i != nSize ; i=next[i])
				num++;
			if(num == 1 ) printf("1 pile remaining: ");
			else printf("%d piles remaining: ",num);

			for(int i = 0 ; i != nSize ; i=next[i])
			{
				if(i) printf(" ");
				printf("%d",arr[i].face.size());
			}
			printf("\n");
			nSize = 0 ;
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值