AT_abc354_e 题解
思路
首先考虑朴素 dfs。若 A 必胜,则说明至少有一种情况能使得 B 必败;若 A 必败,则说明无论他取什么(或者不取),B 都必胜。
当然,那样会 TLE:例如当 A 取了 后 B 取了 与 A 取了 后 B 取 会归为同一种情况,所以我们需要记忆化。记忆化就需要把 数组给当做下标,而 维的 数组显然太麻烦,所以我们可以考虑把 数组状态压缩为一个 int 变量,然后就可以记忆化啦。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair <int, int> pii;
int n, a[20], b[20], vis[262250];
bool dfs (int x) {
if (~ vis[x])
return vis[x];
for (int i = 0; i < n; ++ i)
if (! (x & 1 << i))
for (int j = 0; j < n; ++ j)
if (! (x & 1 << j) && i != j && (a[i] == a[j] || b[i] == b[j]))
if (! dfs (x | (1 << i) | (1 << j)))
return (vis[x] = 1);
return (vis[x] = 0);
}
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> n;
for (int i = 0; i < n; ++ i)
cin >> a[i] >> b[i];
memset (vis, -1, sizeof vis);
cout << (dfs (0) ? "Takahashi" : "Aoki");
return 0;
}

浙公网安备 33010602011771号