"Accordian" Patience UVA

来源:互联网 发布:eclipse java界面开发 编辑:程序博客网 时间:2024/06/03 20:38

模拟题,由于开始时每张牌自成一堆,所以先设置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;}