zoukankan      html  css  js  c++  java
  • 【BZOJ2927】[Poi1999]多边形之战 博弈

    【BZOJ2927】[Poi1999]多边形之战

    Description

    多边形之战是一个双人游戏。游戏在一个有n个顶点的凸多边形上进行,这个凸多边形的n-3条对角线将多边形分成n-2个三角形,这n-3条对角线在多边形的顶点相交。三角形中的一个被染成黑色,其余是白色。双方轮流进行游戏,当轮到一方时,他必须沿着画好的对角线,从多边形上切下一个三角形。切下黑色三角形的一方获胜。
    注:如果连接一个多边形中任意两点的线段都完全包含于这个多边形,则称这个多边形为凸多边形。
    求解任务:
    请设计一个程序:
           ·读入对一个多边形的描述。
    ·确定先走的一方是否能够获胜。
    ·将结果输出。

    Input

    第一行是一个整数, 4 <= n <= 50000。表示多边形的顶点数,多边形的顶点从0到n-1顺时针标号。接着的n-2行描述组成多边形的三角形。第i+1行, 1 <= i <= n-2,有三个空格分隔的非负整数a、 b、 c,它们是第i个三角形的顶点编号。第一个给出的三角形是黑色的。

    Output

    唯一一行应包含一个单词:
    TAK(波兰文“是”),表示先走的一方有必胜策略,或者
    NIE(波兰文“否”),表示先走的一方没有必胜策略。

    Sample Input

    6
    0 1 2
    2 4 3
    4 2 0
    0 5 4

    Sample Output

    TAK

    题解:代码300B的神题

    我们分3种情况讨论

    1.如果黑色三角形有两条边在凸多边形上,那么直接切了就好了,输出TAK
    2.如果黑色三角形有一条边在凸多边形上,那么最终情况一定是一个黑色三角形和一个白色三角形,此时直接取黑色就好了,必胜;然后我们将切掉的白色三角形一个一个加回去。加一个,变成必败了,再加一个,又必胜...所以n为偶则胜,n为奇则败
    3.如果黑色三角形没有边在凸多边形上,那么最终情况还是一个黑色三角形连着一个白色三角形,还是n为偶则胜,n为奇则败

    所以只需要读入一条边就行

    #include <cstdio>
    #include <iostream>
    using namespace std;
    int main()
    {
    	int n,a,b,c,A,B,C;
    	scanf("%d%d%d%d",&n,&a,&b,&c);
    	if(a<b)	swap(a,b);
    	if(a<c)	swap(a,c);
    	if(b<c)	swap(b,c);
    	if((a==b+1&&b==c+1)||(a==n-1&&b==1&&c==0)||(a==n-1&&b==n-2&&c==0))	printf("TAK");
    	else
    	{
    		if(n&1)	printf("NIE");
    		else	printf("TAK");
    	}
    	return 0;
    }

     

  • 相关阅读:
    项目开发管理SDEM
    google安装文件 和 缓存位置:
    数据库 查询超时 运行超时 问题
    将Access、Excel数据导出到MSSQL/使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007
    Mybatis日志(七)
    Mybatis拦截器(六)
    Mybatis动态SQL(五)
    Mybatis的XML映射文件(四)
    Mybatis全局配置文件详解(三)
    Mybatis环境搭建(二)
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6826499.html
Copyright © 2011-2022 走看看