题目:
52张牌叠放在一起,注意,先输入的牌在顶端,然后从上面依次拿出一张从左到右排成一条直线放在桌子上,每张牌代表一个牌堆,然后每次取出手中最上面的一张牌,从左到右依次放在各个牌堆的下面。当往最右边的牌堆放牌后,重新往最左边的牌堆放牌。
满足以下三种条件时,可以把牌从牌堆上拿走,并按从上到下的顺序加入手牌,放置于手牌最底端。 例如 从上到下消掉的牌为
1 2 3 那么牌堆的底部情况如右 牌 牌 1 2 3 牌堆底部。
三种条件分别是
牌堆的最上面两张牌和最下面一张牌的和为 10的倍数,拿走,放入手牌
牌堆的最上面一张牌和最下面两张牌的和为 10的倍数, 拿走,放入手牌
牌堆的最下面三张牌的和为10的倍数 拿走,放入手牌
以上三种情况越前面的越优先执行,执行后,再判断可否继续再执行,即不急着给下一个牌堆放牌。
要点:
- 大部分上面都提到了
- 需要关注的就是 输入牌在手牌的位置,没有牌的牌堆要移除,能连续消牌就消,
- 输出的那个值,是从放第一张牌开始的,包括一开始给每个牌堆放一张牌至七张牌消耗的七张牌。
#include<bits/stdc++.h>
using namespace std;
vector<deque<int>> pile;
set<vector<deque<int>>> s;
bool isEmpty[8];
int t = 14; //已经发完14张牌了
// 0表示总牌堆 1 - 7 表示剩余牌堆
//初始化牌堆
void init(int x) {
t = 14;
memset(isEmpty, false, sizeof(isEmpty));
pile.clear();
s.clear();
pile.resize(8);
pile[0].push_back(x);
int a;
for (int i = 2; i <= 52; i++) {
cin >> a;
// cout << a << endl;
pile[0].push_back(a);
}
for (int i = 1; i <= 14; i++) {
int v = pile[0].front();
pile[0].pop_front();
pile[(i - 1) % 7 + 1]