算法竞赛入门经典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
*/