题意:给你一串含“.”和“X”的字串,每次一个玩家可以把‘."变成“X”,谁先弄到三个XXX就赢。假如先手必赢,输出所有能必赢的第一步,否则输出0。

思路:显然如果一个X周围两格有X那么肯定能一步变成XXX,所以两个人都要避免在自己回合产生这种情况。如果一开始就存在上述情况,那么肯定是那一步。否则我遍历每一个空格看看能不能下这一步。满足我在这个空格变成“X”不会造成上述情况,然后算出nim和是否留给对手一个必败态。

设sg[x]表示长度为x的空格的sg函数,然后我遍历1~x位置变成“X”,那么空格键会被我分成两块(比如.....我在3位置下X,那么空格被我分成了左0右0两块,注意X旁边两块不能动)。

代码:

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
const int maxn = + ;
const int seed = ;
const ll MOD = 1e9 + ;
const int INF = 0x3f3f3f3f;
using namespace std;
int sg[maxn], s[maxn], ans[maxn], pos;
char str[maxn];
void getSG(){
sg[] = ;
for(int i = ; i < maxn; i++){
memset(s, , sizeof(s));
for(int j = ; j <= i; j++){
int t = ;
if(i - j - >= ) t ^= sg[i - j - ];
if(j - >= ) t ^= sg[j - ];
s[t] = ;
}
for(int j = ; j < maxn; j++){
if(!s[j]){
sg[i] = j;
break;
}
}
}
}
bool check(){
ll ret = ;
int num = , len = strlen(str);
for(int i = ; i < len; i++){
if(str[i] == 'X'){
if((i >= && str[i - ] == 'X') || (i >= && str[i - ] == 'X') || (i + < len && str[i + ] == 'X') || (i + < len && str[i + ] == 'X')){
return false;
}
if(str[i - num - ] == 'X' && i - num - >= )
num -= ;
num -= ;
if(num >= ) ret ^= sg[num];
num = ;
}
else{
num++;
}
}
if(str[len - - num] == 'X' && len - - num >= )
num -= ;
if(num >= ) ret ^= sg[num];
return ret == ;
}
void solve(){
pos = ;
int len = strlen(str);
for(int i = ; i < len; i++){
if(str[i] == '.'){
str[i] = 'X';
if(i + < len && i - >= && str[i + ] == 'X' && str[i - ] == 'X'){
ans[pos++] = i + ;
}
else if(i + < len && i + < len && str[i + ] == 'X' && str[i + ] == 'X'){
ans[pos++] = i + ;
}
else if(i - >= && i - >= && str[i - ] == 'X' && str[i - ] == 'X'){
ans[pos++] = i + ;
}
else if(check()){
ans[pos++] = i + ;
}
str[i] = '.';
}
}
}
int main(){
int T, Case = ;
getSG();
scanf("%d", &T);
while(T--){
scanf("%s", str);
solve();
printf("Case %d:", Case++);
if(pos == ) printf(" 0\n");
else{
for(int i = ; i < pos; i++){
printf(" %d", ans[i]);
}
printf("\n");
}
}
return ;
}

LightOJ 1229 Treblecross(SG函数打表 + 遍历)题解的更多相关文章

  1. hdu 2147 SG函数打表(手写也可以) 找规律

    kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/1000 K (Java/Others) Total ...

  2. UPCOJ9526(SG函数打表,nim游戏异或规则)

    #include<bits/stdc++.h>using namespace std;int f[1007],SG[1007],S[1007];//f为可以选取的石头个数,SG为sg函数, ...

  3. bzoj 1228 [SDOI2009]E&D SG函数打表 找规律

    题目链接 Description 桌子上有2n 堆石子,编号为1..2n.将第2k-1 堆与第2k 堆(1 ≤ k ≤ n)为同一组.第i堆的石子个数用一个正整数Si表示.一次分割操作指的是,从桌子上 ...

  4. hdu1848(sg函数打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848 题意:中文题诶- 思路:直接sg函数打表就好了 代码: #include <iostrea ...

  5. 51 nod1067 Bash游戏 V2(sg函数打表)

    1067 Bash游戏 V2 1.0 秒 131,072.0 KB 5 分 1级题   有一堆石子共有N个.A B两个人轮流拿,A先拿.每次只能拿1,3,4颗,拿到最后1颗石子的人获胜.假设A B都非 ...

  6. Educational Codeforces Round 68 (Rated for Div. 2)D(SG函数打表,找规律)

    #include<bits/stdc++.h>using namespace std;int sg[1007];int main(){ int t; cin>>t; while ...

  7. Nowcoder 挑战赛23 B 游戏 ( NIM博弈、SG函数打表 )

    题目链接 题意 : 中文题.点链接 分析 : 前置技能是 SG 函数.NIM博弈变形 每次可取石子是约数的情况下.那么就要打出 SG 函数 才可以去通过异或操作判断一个局面的胜负 打 SG 函数的时候 ...

  8. UVa 10561 Treblecross (SG函数)

    题意:给定上一行字符串,其中只有 X 和 . 并且没有连续的三个 X,两个玩家要分别在 . 上放 X,如果出现三个连续的 X,则该玩家胜利,现在问你先手胜还是败,如果是胜则输出第一步可能的位置. 析: ...

  9. lightoj 1229 - Treblecross 博弈论

    思路:SG函数 枚举先手的每一个位置是否有必胜. 1)如果出现了XXX则必胜: 2)如果出现了XX或X.X则必败: 3)否则计算后手的sg值和. 代码如下: #include<iostream& ...

随机推荐

  1. Flip Game---poj1753(状压+bfs)

    题目链接:http://poj.org/problem?id=1753    题意:是有一个4X4的图,b代表黑色,w代表白色,问最少翻转几次可以把所有的点变成白色或者黑色,每次翻转一个点时,可以把它 ...

  2. ViewPager的OnPageChangeListener三个回调解析

    一个native crash最后是重写ViewPager解决的,过程中发现这三个回调还有点绕,于是理了一下 ViewPager有两个操作,一个是用手指滑动翻页,一个是直接setCurrentItem( ...

  3. sublime 使用总结

    不管你用什么编辑,sublime是首选编辑器,就是sublime淘汰,但已成为标准.例如:atom,几乎等同于sublime,及其他可以几乎调成到sublime操作方式. 一.常用插件 插件搜索地址: ...

  4. 改变wordpress图片上传后的压缩质量

    WordPress 在图片上传后会默认压缩图片质量为原来的 90%,这样做的好处可以极大的加快页面的载入速度与缩小图片大小所占服务器空间. 如果希望 100% 原质量怎么办呢?如何禁止 WordPre ...

  5. MySQL纯透明的分库分表技术还没有

    MySQL纯透明的分库分表技术还没有  种树人./oneproxy --proxy-address=:3307 --admin-username=admin --admin-password=D033 ...

  6. 上传指定url文件到阿里云oss

    好处是不用下载到本地,也不用删除本地文件.省事! 先下载阿里云官方代码  https://github.com/aliyun/aliyun-oss-csharp-sdk 引用其中的 aliyun-os ...

  7. [sh]sh最佳实战(含grep)

    sh虐我千百遍,我待sh如初恋. sh复习资料 http://www.cnblogs.com/iiiiher/p/5385108.html http://blog.csdn.net/iiiiher/a ...

  8. BGD-py实现学习【1】[转载]

    转自:https://github.com/icrtiou/Coursera-ML-AndrewNg 1.源码-对数据读取 import numpy as np import pandas as pd ...

  9. unity3d-绘制贴图

    准备贴图 在屏幕在绘制一张静态贴图,需要用到GUI.DrawTexture()方法, 该方法可以设定图片的显示位置.缩放比例和渲染混合等 /* Rect position:表示图片的绘制区域 * Te ...

  10. yii2--windows下composer安装

    //文件及存放目录 D:\php\php.exe D:\php\composer.phar //设置path(追加) ; D:\php //创建composer.bat文件 D:\php>ech ...