#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <list>
#include <cmath>
#include <fstream>
#include <string>
using namespace std;
typedef long long ll;
const int MAXN = 30;
const int inf = 0x3f3f3f3f;
int nm;
int p[MAXN], mk[MAXN];
int sg[1<<12];
int fid(int a, int b) {
if (a + 1 == b) {
if (a <= 3)
return a - 1;
else if (a <= 7)
return a - 2;
else if (a <= 11)
return a - 3;
else return a - 4;
} else
return a + 11;
}
int how(int a, int b) {
int id = fid(a, b);
mk[id] = 1;
int num = 0;
if (a + 1 == b) {
if (id - 3 >= 0) {
if (mk[id - 3] && mk[id + 8 + id / 3] && mk[id + 9 + id / 3])
num ++;
}
if (id + 3 < 12) {
if (mk[id + 3] && mk[id + 12 + id / 3] && mk[id + 13 + id / 3])
num ++;
}
} else {
if (id % 4) {
if (mk[id - 1] && mk[id - 10 - id / 4] && mk[id - 7 - id / 4])
num ++;
}
if (id % 4 != 3) {
if (mk[id + 1] && mk[id - 9 - id / 4] && mk[id - 6 - id / 4])
num ++;
}
}
return num;
}
int ok(int id, int state) {
return state & 1<<id;
}
int how2(int id, int flag, int state) {
int num = 0;
if (!flag) {
if (id - 3 >= 0) {
if (ok(id - 3, state) && ok(id + 8 + id / 3, state) && ok(id + 9 + id / 3, state))
num ++;
}
if (id + 3 < 12) {
if (ok(id + 3, state) && ok(id + 12 + id / 3, state) && ok(id + 13 + id / 3, state))
num ++;
}
} else {
if (id % 4) {
if (ok(id - 1, state) && ok(id - 10 - id / 4, state) && ok(id - 7 - id / 4, state))
num ++;
}
if (id % 4 != 3) {
if (ok(id + 1, state) && ok(id - 9 - id / 4, state) && ok(id - 6 - id / 4, state))
num ++;
}
}
return num;
}
int gao(int s, int t, int s2) {
int &ans = sg[s], num;
if (ans != -1) return ans;
if (s == (1<<nm) - 1)
return ans = 0;
for (int i = 0; i < nm; ++i) {
if (1<<i & s) continue;
int y = p[i];
if (y < 12)
num = how2(y, 0, s2);
else
num = how2(y, 1, s2);
ans = max(ans, t - gao(s | 1<<i, t - num, s2 | 1<<y));
}
return ans;
}
void solve(int cs) {
memset(sg, -1, sizeof(sg));
memset(mk, 0, sizeof(mk));
int n, num, num2, ans;
num = num2 = nm = 0;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
int a, b;
scanf("%d%d", &a, &b);
if (a > b) swap(a, b);
int tt = how(a, b);
if (i % 2 == 0)
num += tt;
num2 += tt;
}
int s2 = 0;
for (int i = 0; i < 24; ++i) {
if (!mk[i]) p[nm ++] = i;
else s2 |= 1<<i;
}
printf("Case #%d: ", cs);
int now = gao(0, 9 - num2, s2);
if (n & 1) ans = num + (9 - num2 - now);
else ans = num + now;
if (ans >= 5) printf("Tom200\n");
else printf("Jerry404\n");
}
int main() {
int T;
scanf("%d", &T);
for (int cs = 1; cs <= T; ++cs)
solve(cs);
return 0;
}
HDU 4753
最新推荐文章于 2016-03-28 09:55:37 发布