说在前面
终于自己想出来了一道博弈题!!!
me别是个sabi吧
题目
题面
这是一个双人游戏。游戏在
n
n
个顶点的凸多边形上进行,其中有 条不交叉的对角线,将多边形分成
n−2
n
−
2
个三角形。三角形中的一个被染成黑色,其余是白色。双方轮流进行游戏,当轮到一方时,他必须沿着画好的对角线,从多边形上切下一个三角形。切下黑色三角形的一方获胜。
范围:
4≤n≤50000
4
≤
n
≤
50000
输入输出格式
输入格式:
第一行一个整数
n
n
接下来每行三个整数,描述一个三角形的三个顶点
输出格式:
如果先手必胜,输出TAK,否则输出NIE
解法
首先,如果这个三角形三个顶点相邻,那么先手必胜(第一刀就可以切)
否则,当黑色三角形只有一边与白色三角形相邻时,才可以被切,显然那个白色三角形是最后一个白色三角形
于是就变成了这样:,有 个石子,一次只能取一个,问取最后一个的人是谁
然后就做完了
下面是代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
int N , a[4] ;
int main(){
scanf( "%d" , &N ) ;
scanf( "%d %d %d" , &a[1] , &a[2] , &a[3] ) ;
sort( a + 1 , a + 3 ) ;
if( ( a[2] == a[1] + 1 && a[3] == a[1] + 2 ) ||
( a[1] == 0 && a[2] == 1 && a[3] == N - 1 ) ||
( a[1] == 0 && a[2] == N - 2 && a[3] == N - 1 ) )
puts( "TAK" ) ;
else puts( ( N - 3 )&1 ? "TAK" : "NIE" ) ;
}