bzoj 2927 博弈论

该博客探讨了一种博弈策略问题:如何通过连接多边形的对角线将其分割成三角形,并指定一个黑色三角形。玩家轮流切下三角形,切到黑色三角形的玩家获胜。博客指出,当黑色三角形只有一个相邻的三角形时,先手有必胜策略。此外,通过表格分析,发现其他情况的结果仅与多边形的顶点数的奇偶性有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意: 将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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值