紫书 纸牌游戏 UVa127

在这里插入图片描述

思路:本题主要考察数据结构和stl的使用。牌堆用stack存储,再用list把stack链接起来。由于要求一张牌移动后应当查看该涨牌是否可以继续移动,故使迭代器指向其移动后的位置,以便判断其是否可以继续移动。
输出:本题应当注意pile输出的单复数。

#include<cmath>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<cstdio>
#include<iostream>
#include<string>
#include<numeric>
#include<algorithm>
#include<map>
#include<vector>
#include<set>
#include<sstream>
#include<fstream>
#include<queue>
#include<stack>
#include<unordered_map>
#include<tuple>
#include<deque>
#include<functional>
#include<iterator>
#include<array>
#include<list>
#include<forward_list>
using namespace std;
struct Card
{
	char suit;
	char rank;
	Card(char _suit, char _rank)
		:suit(_suit), rank(_rank) {
	}
	Card(const Card& c)
	{
		suit = c.suit;
		rank = c.rank;
	}
	bool match(const Card& c2)
	{
		return suit == c2.suit || rank == c2.rank;
	}
};
typedef stack<Card> stcard;
list<stcard>piles;

list<stcard>::iterator minus3(list<stcard>::iterator iter)
{
	for (int i = 0; i < 3; ++i)
	{
		if (iter == piles.begin())
			return piles.end();
		--iter;
	}
	return iter;
}
bool ifMatchThenDelete(list<stcard>::iterator iterleft, list<stcard>::iterator& stitercur)
{
	Card cur = stitercur->top();
	Card leftcard = iterleft->top();
	if (cur.match(leftcard))
	{
		iterleft->push(cur);
		stitercur->pop();
		if (stitercur->empty())
		{
			piles.erase(stitercur);
		}
		stitercur = iterleft;
		return true;
	}
	return false;
}
int main() {
	//freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
	char card[4];
	while (scanf("%s", card) == 1 && card[0] != '#')
	{
		for (auto& elem : piles)
		{
			while (!elem.empty())
				elem.pop();
		}
		piles.clear();
		stcard mystack;
		mystack.push(Card(card[1], card[0]));
		piles.push_back(std::move(mystack));
		for (int i = 1; i < 52; ++i)
		{
			scanf("%s", card);
			stcard mystack;
			mystack.push(Card(card[1], card[0]));
			piles.push_back(std::move(mystack));
		}
		list<stcard>::iterator stitercur = ++piles.begin();
		while (stitercur != piles.end())
		{
			if (stitercur == piles.begin())
			{
				++stitercur;
				continue;
			}
			list<stcard>::iterator stiterleft1 = --stitercur;
			++stitercur;
			list<stcard>::iterator stiterleft3 = minus3(stitercur);
			if (stiterleft3 != piles.end())
			{
				if (ifMatchThenDelete(stiterleft3, stitercur))
					continue;
			}
			if (ifMatchThenDelete(stiterleft1, stitercur))
				continue;
			++stitercur;
		}
		printf("%d pile%s remaining:", (int)piles.size(), piles.size() > 1 ? "s" : "");
		for (auto& elem : piles)
		{
			printf(" %d", (int)elem.size());
		}
		puts("");
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值