题意: 将n个点的多边形连n-3条不相交的对角线分成n-2个三角形,指定一个黑色的三角形,两个人轮流沿画好的对角线切下来一个三角形,切下来黑色的三角形赢,问先手是否必胜。
将相临的三角形连一条边,然后把黑三角形拎出来,这就是一个树了。
如果黑三角形只有一个儿子,那么先手必胜。
打个表可以发现别的情况只和n奇偶性有关。
#include <stdio.h>
int n,a,b,c,t;
int main()
{
scanf("%d",&n);
scanf("%d%d%d",&a,&b,&c);
if(a>b)t=a,a=b,b=t;
if(b>c)t=b,b=c,c=t;
if(a>b)t=a,a=b,b=t;
if(b==a+1&&b==c-1){puts("TAK");return 0;}
if(a==0&&b==1&&c==n-1){puts("TAK");return 0;}
if(a==0&&b==n-2&&c==n-1){puts("TAK");return 0;}
puts(n&1 ? "NIE":"TAK");
}
附打表代码:
#include <bits/stdc++.h>
using namespace std;
int f[110][110][110];
int main()
{
freopen("tt.in","w",stdout);
for(int i=0;i<=100;i++)
for(int j=0;j<=100;j++)
for(int k=0;k<=100;k++)
{
int flag=0;
if(i==0&&j==0)flag=1;
if(j==0&&k==0)flag=1;
if(i==0&&k==0)flag=1;
if(flag){f[i][j][k]=1;continue;}
if(i&&!f[i-1][j][k])flag=1;
if(j&&!f[i][j-1][k])flag=1;
if(k&&!f[i][j][k-1])flag=1;
f[i][j][k]=flag;
}
for(int i=0;i<=100;i++)
{
printf("%d : \n",i);
for(int j=0;j<=100;j++)
{
for(int k=0;k<=100;k++)
printf("%d",f[i][j][k]);
puts("");
}
puts("");
}
return 0;
}