GDOI2012 AB棋(chess)解题报告

GDOI2012 AB棋(chess)解题报告
Description

AB棋是两个人玩的博弈游戏。它的棋盘是一排n个格子,从左到右标号0..n-1。初始时某些格子上面有一只棋子。

两个人轮流走,他们都有两种走法:

A. 把一只棋子往左走一步。即把i上的棋子走到i-1上(必须满足i>=1,i上有棋子且i-1上没棋子)

B. 把一只棋子跳过左面的棋子。即把i上的棋子跳过i-1到i-2上(必须满足i>=2,i和i-1上有棋子且i-2上没有棋子)

谁不能走谁就输了。

给定棋盘的初始状态,你要判断出,在两个人都用最佳策略的情况下,先手胜还是后手胜。

Input

输入文件包含多个棋盘状态,第一行只有一个整数代表棋盘状态的数量T。

下面T行,每行一个01串,代表一个棋盘状态。0代表空格,1代表有棋子。

01串的长度即为n。其方向与棋盘一致,即01串的左边为棋盘的左边。

Output

输出文件应包含T行。

每行输出对应棋盘状态的胜方。先手胜输出first,后手胜输出second。

Sample Input

8
0001
11111
01001
0101001
01001001001
0111
0001111
0111001111

Sample Output

first
second
second
first
second
second
first
first

Data Constraint

Hint

【数据范围】

有30%的数据,T<=20,n<=20

另外有30%的数据,T<=20,n<=10000,棋盘初始时没有紧挨着的两只棋子,即‘11’不是该棋盘对应01串的子串。

剩下的40%的数据,T<=20,n<=10000。

解题思路:
看了当时gdoi现场讲解的视频http://v.youku.com/v_show/id_XMzkwMjcxNTIw.html?from=y1.2-1-87.3.3-1.1-1-1-2-0 觉得方法好神奇,感谢出题人出了道好题,膜拜全场唯一AC的卢神。

做法和简单证明视频里有。分享我看了题解之后的一些关于题目模型转化的简单想法。

问题可以转化成:
给出一堆数,有两种操作:
1.把一个数减一。
2.把两个相同的数同时减一。
每个数最小只能减到0,无法操作者输。

3个相同的数对结果没有影响,把这三个数表示为(x,x,x),一个人把(x,x,x)变成(x-1,x,x)或者(x-1,x-1,x)之后,另外一个人可以把这3个数变成(x-1,x-1,x-1)。
偶数对结果没有影响,因为一个操作者把一个(对)偶数变成一个(对)奇数之后,另外一个人可以把一个(对)奇数变成一个(对)偶数。
排除了这两种情况,现在剩下一个个单个奇数,或者一对对相同的奇数对。不妨设前者数量为a,后者数量为b,那么问题转化为:
有三种操作:
1.b=b-1
2.b=b-1,a=a+1
3.a=a-1
操作后a,b非负,终止必败态为a=0,b=0。把a,b表示为[奇/偶,奇/偶],推理可得
1.[奇,偶],[偶,奇],[奇,奇](以上三个为必胜态)可以转化为[偶,偶](此为必败)。必胜态可以转为必败态
2.而[偶,偶]只能转化为[奇,偶],[偶,奇],[奇,奇]中的一个。必败态只能转为必胜态。

统计a,b的数量,判断(a&1)|(b&1)的值。
个人感觉sg可以出的很难,所以不得不总结一下之前见过的sg问题:简单nim,anti-sg,每次可以取d堆的取石子,树上割边问题。
每次可以取d堆的取石子,一堆石子每次只能取不多于d个石子,还有本题中3个相同的数对结果没有影响所用到的结论,可以说成:每次只能对1到d操作的游戏特征,意味着可以维护(d+1)操作且每人各操作一步。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页