UVA 127 “Accordian“ Patience(算法竞赛入门经典,模拟,stl)

算法竞赛入门经典179页,模拟,stl
题目意思:模拟题,关键理解题目意思和样例
有 52 张扑克牌,一开始,全部排列成一行,每张牌看做是一堆牌。每次从左到右扫描, 假设当前扫描到第 x 堆牌(假设这堆牌的最上面是 x),
x 牌如果 和 x 前面第 1 张 或者第 3 张 牌匹配的话,就把第 x 堆牌最上面的那一张牌,放到与之匹配的那张牌所在堆的最上面。
优先选择最左边的牌。 如果这张牌的 左边 第1 和第3 都与之匹配,那么优先 放在第 3 个的位置。

本题要点:
1、 每一堆牌,用 stack 来存,合适不过了。
再用 vector 来存 各个栈。 vector<stack > pile;
2、后面就是模拟了, 当某个栈为空之后,这个栈需要删除,调用 vector 的erase 函数即可。
3、输出注意 单数复数问题,pile 和 piles

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stack>
using namespace std;
const int MaxN = 53;
int n;

struct node
{
	string val;
	int cnt;
};

vector<stack<node> > pile;

void handle_line(const string& line)
{
	string str;
	node tmp;
	stringstream ss(line);
	while(ss >> str)
	{
		tmp.val = str, tmp.cnt = 1;
		stack<node> s;
		s.push(tmp);
		pile.push_back(s);
	}
}

bool match(int i, int j)
{
	return pile[i].top().val[0] == pile[j].top().val[0] || pile[i].top().val[1] == pile[j].top().val[1];
}

bool remove_top(int i, int j)	// 移动栈顶元素
{
	node x = pile[j].top();	
	pile[i].push(x);
	pile[j].pop();
	if(pile[j].size())
	{
		return true;
	}
	pile.erase(pile.begin() + j);
	return false;
}

bool can_remove(int &k, int i)
{
	if(i >= 3 && match(i - 3, i))	
	{
		k = i - 3;
		return true;
	}
	if(i >= 1 && match(i - 1, i))
	{	
		k = i - 1;
		return true;
	}
	return false;
}

void solve()
{
	int k;
	while(true)
	{
		bool flag = false;
		for(unsigned int i = 0; i < pile.size(); ++i)
		{
			if(can_remove(k, i))
			{
				flag = true;
				remove_top(k, i);
				break;
			}
		}
		if(!flag)
			break;
	}
	if(1 == pile.size())
	{
		printf("1 pile remaining: 52\n");
		return;
	}
	printf("%d piles remaining:", (int)pile.size());
	int len = pile.size();
	for(int i = 0; i < len; ++i)
	{
		printf(" %d", (int)pile[i].size());
	}
	printf("\n");
}

int main()
{
	string line;
	while(getline(cin, line))
	{
		if(line == "#")	break;
		handle_line(line);
		getline(cin, line);
		handle_line(line);
		solve();
		pile.clear();
	}
	return 0;
}

/*
QD AD 8H 5S 3H 5H TC 4D JH KS 6H 8S JS AC AS 8D 2H QS TS 3S AH 4H TH TD 3C 6S
8C 7D 4C 4S 7S 9H 7C 5D 2S KD 2D QH JD 6D 9D JC 2C KH 3D QC 6C 9S KC 7H 9C 5C
AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC AD 2D 3D 4D 5D 6D 7D 8D TD 9D JD QD KD
AH 2H 3H 4H 5H 6H 7H 8H 9H KH 6S QH TH AS 2S 3S 4S 5S JH 7S 8S 9S TS JS QS KS
#
*/

/*
6 piles remaining: 40 8 1 1 1 1
1 pile remaining: 52
*/

猜你喜欢

转载自blog.csdn.net/qq_38232157/article/details/108351215
今日推荐