"Accordian" Patience UVA - 127

模拟题,由于开始时每张牌自成一堆,所以先设置52个堆,每个堆用一个栈s来存储内部所存放的字符串,用pre存储前面一个堆的编号,用next存储后面一个堆的编号,方便查找与比较。然后对于从编号2开始的每个堆,先比较其向左数第三个堆(如果存在的话)是否满足条件,如果满足则移动元素,否则就比较其左边第一个堆是否满足交换条件。同时需要注意,如果这个堆的元素个数为0的时候,我们就要修改相应的pre以及next关系,从而保证所有“链接”在一起的堆的元素个数均不为0,同时这个题目还有一个小坑,当最终的堆数为1的时候,输出的是“1 pile”而不是“1 piles”。其他的具体实现见如下代码:

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
using namespace std;

typedef struct{
	stack<string> data;
	int pre, next;
}arr;

int main(){
	string s;
	while (cin >> s){
		if (s == "#") break;
		arr demo[60];
		demo[0].pre = -1;
		demo[0].next = 1;
		demo[1].pre = 0;
		demo[1].next = 2;
		demo[1].data.push(s);
		for (int i = 2; i <= 52; i++){
			cin >> s;
			demo[i].data.push(s);
			demo[i].pre = i - 1;
			demo[i].next = i + 1;
		}
		for (int i = 2; i <= 52; i=demo[i].next){
			int index1 = demo[demo[demo[i].pre].pre].pre;
			if (index1 >0&&((demo[index1].data.top()[0]==demo[i].data.top()[0])
				|| (demo[index1].data.top()[1] == demo[i].data.top()[1]))){
				demo[index1].data.push(demo[i].data.top());
				demo[i].data.pop();
				if (demo[i].data.size() == 0){
					demo[demo[i].pre].next = demo[i].next;
					demo[demo[i].next].pre = demo[i].pre;
				}
				i = 1;
				continue;
			}
			int index2 = demo[i].pre;
			if (demo[index2].data.top()[0] == demo[i].data.top()[0] ||
				demo[index2].data.top()[1] == demo[i].data.top()[1]){
				demo[index2].data.push(demo[i].data.top());
				demo[i].data.pop();
				if (demo[i].data.size() == 0){
					demo[demo[i].pre].next = demo[i].next;
					demo[demo[i].next].pre = demo[i].pre;
				}
				i = 1;
				continue;
			}
		}
		vector<int> result;
		for (int i = 1; i <= 52; i = demo[i].next){
			result.push_back(demo[i].data.size());
		}
		if (result.size() == 1) cout << result.size() << " pile remaining:";
		else cout << result.size() << " piles remaining:";
		for (int i = 0; i < result.size(); i++){
			cout << " " << result[i];
		}
		cout << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值