都来康康好VAN的♂
查看原帖
都来康康好VAN的♂
461366
封禁用户楼主2021/10/4 14:54

求助QAQ,谁能帮我A我发一下链接

// https://ghostbin.com/fQdYm
#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.find(make_pair(cards, pile)) != path.end()) return 3;
	path.insert(make_pair(cards, pile));
	return 0;
}

bool check(int x) {
	if ((x == 10) || (x == 20) || (x == 30)) return 1;
	return 0;
}

void insert(vector<int> &ins) {
	ins.push_back(cards[0]);
	cards.erase(cards.begin());
	bool sgn;
	do {
		sgn = true;
		while (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();
			sgn = false;
		}
		while (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();
			sgn = false;
		}
		while (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();
			sgn = false;
		}
	} while (!sgn);
}

bool solve() {
	int x;
	scanf("%d", &x);
	if (!x) return 0;
	cards.push_back(x);
	for (int i = 0; i < 51; i++) {
		scanf("%d", &x);
		cards.push_back(x);
	}
	for (int i = 0; i < 7; i++) {
		pile[i].push_back(cards[0]);
		cards.erase(cards.begin());
		path.insert(make_pair(cards, pile));
	}
	int status, pos = -1;
	do {
		while (pile[++pos % 7].empty());
		insert(pile[pos % 7]);
		ans++;
	} while (!(status = pending()));
	printf("%s: %d\n", result[status].c_str(), ans);
	return 1;
}

int main() {
	//freopen("uva_output.txt", "w", stdout);
	do init(); while (solve());
	return 0;
}
2021/10/4 14:54
加载中...