比赛 20120708 评测结果 WWWTTTTTTT
题目名称 硬币收集者 最终得分 0
用户昵称 CC 运行时间 14.250 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2012-07-08 11:30:42
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
map <int,int> t;
int n,m,ans;
int a[300][4],c[300][2];
bool use[300];
bool check() {
	if (t.size() == 0) return 1;
	for (typeof(t.begin()) i = t.begin();i != t.end();i++) 
		if ((i ->second) && (i->second % 2)) return 1;
	return 0;
}

bool pan(int u) {
	if (u > m) {
		if (!check()) return 0;
		return 1;
	}
	use[u] = 0;
	if (!pan(u + 1)) return 0;
	use[u] = 1;
	t[c[u][0]]++;t[c[u][1]]++;
	if (!pan(u + 1)) return 0;
	t[c[u][0]]--;t[c[u][1]]--;
	return 1;
}
	
bool dfs(int u) {
	if (u > n) {
		t.clear();
		if (pan(1)) {
			ans = std::max(ans,m);
			return 1;
		}
		return 0;
	}
	if (!dfs(u + 1)) return 0;
	c[++m][0] = a[u][0];c[m][1] = a[u][1];
	dfs(u + 1);
	c[m][0] = a[u][2];c[m][1] = a[u][3];
	dfs(u + 1);
	m--;
	return 1;
}
	
int main() {
	freopen("coinmn.in","r",stdin);
	freopen("coinmn.out","w",stdout);
	scanf("%d", &n);
	while (n) {
		for (int i = 1;i <= n;i++) 
			for (int j = 0;j < 4;j++) scanf("%d", &a[i][j]);
		dfs(1);
		printf("%d\n", ans * 2);
		scanf("%d", &n);
	}
	return 0;
}