题目链接https://vjudge.net/problem/UVA-10561
• 题目大意:
给定一行只含'.'和'X'的字符串且没有连续三个“XXX”的情况,两个玩家依次将'.'改成‘X’,
当一方操作后出现“XXX”的情况时,该方胜利。问先手是否能获胜?
若能,输出所有先手第一步可以操作的位置。
• 分析:
一步胜利的情况:
首先要把一步就能取胜的情况单独处理,即“.....XX.....”和“.....X.X.......”,
一旦存在这种情况就不需要考虑一般的情况了,输出所有获胜位置即可。
这里要注意边界位置的处理。
对于一般情况下:
枚举每两个X之间的区间,并求其SG值,可以对1~N长度的SG值在线打表。
求出其区间长度作为下标访问其SG值,整个游戏的SG值ns^=该子游戏的SG值,
并记录下该区间的信息(起始位置和长度),用来后续求先手第一步操作的位置。
注意:
对于全为'.'的情况需要特判。
对X枚举完后,右边界可能会剩下的全'.'区间。(只枚举到了最右边的X,右边可能还有位置)
若为先手胜利,需对之前记录下的每个区间(子游戏)的每个位置进行枚举,
相当于模拟先手第一步的位置,当该位置变为X时使得整个游戏的SG值ns==0时,
留给对手的局面就是ns==0的必败点,这种位置就是我们所要求的位置。
• 求先手第一步的具体原理:
•AC代码:
#include
#include
#include
#include
#include
#include
#include
#include