您的位置:首页 > 其它

"Accordian" Patience UVA - 127

2017-08-03 09:08 417 查看
模拟题,由于开始时每张牌自成一堆,所以先设置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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: