发现是一个博弈题,数据范围N<18,状压DP。
枚举所有的状态1<<18;因为必败态能一步转移到必胜态,一开始状态为0000000,为必败态;
后面的状态 |= (!上一步状态)
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long LL;
typedef unsigned long long ULL;
const int N = 1e1+10;
int mod = 1e9+7;
int P = 13331;
int n, A[N], B[N], dp[1<<20];
void solve()
{
cin >> n;
for (int i = 0;i < n;i++) cin >> A[i] >> B[i];
for (int s = 0;s < (1<<n);s++)//枚举所有状态,1为必胜,2为必败
{
for (int i = 0;i < n;i++)
{
for (int j = 0;j < n;j++)
{
//枚举卡片
if (i == j) continue;//相同不能取
if (A[i] != A[j]&&B[i] != B[j]) continue;//不一样不能选
if (((s>>i)&1)&&((s>>j)&1))//如何还没被删除
{
dp[s] |= (!dp[s-(1<<i)-(1<<j)]);//只要有一个为必败态,就可以转移到必胜态
}
}
}
}
if (dp[(1<<n)-1]) cout << "Takahashi";
else cout << "Aoki";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}