AT_abc354_e 题解

思路

首先考虑朴素 dfs。若 A 必胜,则说明至少有一种情况能使得 B 必败;若 A 必败,则说明无论他取什么(或者不取),B 都必胜。

当然,那样会 TLE:例如当 A 取了 a,ba,b 后 B 取了 c,dc,d 与 A 取了 c,dc,d 后 B 取 a,ba,b 会归为同一种情况,所以我们需要记忆化。记忆化就需要把 visvis 数组给当做下标,而 1818 维的 mpmp 数组显然太麻烦,所以我们可以考虑把 visvis 数组状态压缩为一个 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;
}
posted @ 2024-05-19 20:21  Vitamin_B  阅读(10)  评论(0)    收藏  举报  来源