苦逼的蒟蒻5小时了还没调出来,大佬帮忙看看吧
#include <bits/stdc++.h>
using namespace std;
const string result[] = {"", "Win ", "Loss", "Draw"};
set<pair<vector<int>, vector<vector<int> > > > path;
vector<int> cards;
vector<vector<int> > pile;
int ans;
void init() {
path.clear();
vector<int>().swap(cards);
vector<vector<int> >(7).swap(pile);
ans = 7;
}
int pending() {
bool win = 1;
for (int i = 0; i < 7; i++) win &= (pile[i].empty());
if (win) return 1;
if (cards.empty()) return 2;
if (path.count(make_pair(cards, pile))) return 3;
path.insert(make_pair(cards, pile));
return 0;
}
int check(int x) {
if ((x == 10) || (x == 20) || (x == 30)) return x;
return 0;
}
void insert(vector<int> &ins, int x) {
ins.push_back(x);
if (ins.size() >= 3 && check(ins[0] + ins[1] + ins.back())) {
cards.push_back(ins[0]);
cards.push_back(ins[1]);
cards.push_back(ins.back());
ins.erase(ins.begin());
ins.erase(ins.begin());
ins.pop_back();
}
if (ins.size() >= 3 && check(ins[0] + ins[ins.size() - 2] + ins.back())) {
cards.push_back(ins[0]);
cards.push_back(ins[ins.size() - 2]);
cards.push_back(ins.back());
ins.erase(ins.begin());
ins.pop_back();
ins.pop_back();
}
if (ins.size() >= 3 && check(ins[ins.size() - 3] + ins[ins.size() - 2] + ins.back())) {
cards.push_back(ins[ins.size() - 3]);
cards.push_back(ins[ins.size() - 2]);
cards.push_back(ins.back());
ins.pop_back();
ins.pop_back();
ins.pop_back();
}
}
bool solve() {
int x;
cin >> x;
if (!x) return 0;
cards.push_back(x);
for (int i = 0; i < 51; i++) {
cin >> x;
cards.push_back(x);
}
for (int i = 0; i < 7; i++) pile[i].push_back(cards[i]);
cards.erase(cards.begin(), cards.begin() + 7);
int status, pos = 0;
do {
while (pile[pos % 7].empty()) pos++;
insert(pile[pos++ % 7], cards[0]);
cards.erase(cards.begin());
ans++;
} while (!(status = pending()));
cout << result[status] << ": " << ans << endl;
return 1;
}
int main() {
do init();
while (solve());
return 0;
}