思路:SG函数

枚举先手的每一个位置是否有必胜。

1)如果出现了XXX则必胜;

2)如果出现了XX或X.X则必败;

3)否则计算后手的sg值和。

代码如下:

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#define M 201
using namespace std;
char str[M];
int sg[M],len;
vector<int>p;
int get_sg(int m) //计算SG值
{
if(m<) return ;
if(sg[m]!=-) return sg[m];
bool vis[]={};
for(int i=;i<=m;i++)
vis[get_sg(i-)^get_sg(m-i-)]=;
int i=;
while(vis[i]) i++;
return sg[m]=i;
}
bool cal(int m)
{
char s[M];
strcpy(s,str);
if(s[m]=='X') return ;
s[m]='X';
for(int i=;i+<len;i++) //出现XXX
if(s[i]=='X'&&s[i+]=='X'&&s[i+]=='X') return ;
for(int i=;i+<len;i++) //出现XX
if(s[i]=='X'&&s[i+]=='X') return ;
for(int i=;i+<len;i++) //出现X.X
if(s[i]=='X'&&s[i+]=='X') return ;
int i,j,ans=;
bool f=;
for(i=,j=-;i<len;i++){ //计算后手的SG值和
if(s[i]=='X'){
if(f) ans^=get_sg(i-j-); //当两边都出现的X时要减去4
else{
ans^=get_sg(i-j-); //当只有一边出现X时要减去2
f=;
}
j=i;
}
}
ans^=get_sg(len-j-);
return ans==;
}
int main()
{
int t,ca=;
memset(sg,-,sizeof(sg));
scanf("%d",&t);
while(t--){
scanf("%s",&str);
len=strlen(str);
p.clear();
for(int i=;i<len;i++)
if(cal(i)) p.push_back(i+);
printf("Case %d:",++ca);
if(p.size()){
for(int i=;i<p.size();i++)
printf(" %d",p[i]);
puts("");
}
else printf(" 0\n");
}
return ;
}

lightoj 1229 - Treblecross 博弈论的更多相关文章

  1. LightOJ 1229 Treblecross(SG函数打表 + 遍历)题解

    题意:给你一串含“.”和“X”的字串,每次一个玩家可以把‘."变成“X”,谁先弄到三个XXX就赢.假如先手必赢,输出所有能必赢的第一步,否则输出0. 思路:显然如果一个X周围两格有X那么肯定 ...

  2. LightOJ 1229 Tablecross

    Treblecross is a two player game where the goal is to get three X in a row on a one-dimensional boar ...

  3. 爆零后的感受外加一道强联通分量HDU 4635的题解

    今天又爆零了,又是又,怎么又是又,爆零爆多了,又也就经常挂嘴边了,看到这句话,你一定很想说一句””,弱菜被骂傻,也很正常啦. 如果你不开心,可以考虑往下看. 翻到E(HDU 4635 Strongly ...

  4. UVA 10561 Treblecross(博弈论)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209 [思路] 博弈论. 根据X分布划分禁区,每个可以放置的块为 ...

  5. lightoj 1296 - Again Stone Game 博弈论

    思路:由于数据很大,先通过打表找规律可以知道, 当n为偶数的时候其SG值为n/2; 当n为奇数的时候一直除2,直到为偶数m,则SG值为m/2; 代码如下: #include<stdio.h> ...

  6. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  7. IT人生知识分享:博弈论的理性思维

    背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东( ...

  8. LightOj 1298 - One Theorem, One Year(DP + 欧拉)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...

  9. [poj2348]Euclid's Game(博弈论+gcd)

    Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9033   Accepted: 3695 Des ...

随机推荐

  1. [NOI2008] [bzoj1061] 志愿者招募

    还是一道费用流的题目.话不多说,进入正题. 题意:给定n个点和m种从l到r覆盖一层的费用,求满足所有点的覆盖层数都大等于权值的最小费用 分析:要做到区间修改,看似比较麻烦. 用差分把区间修改变成单点修 ...

  2. mssql手工注入1

    强制字符转成数字, 所以报错, 能获得数据 查版本号: http: -- 查数据库版本: http: -- 查当前数据库用户(如果看到dbo 那么多半当前数据库的用户是dba权限): http: -- ...

  3. java===java基础学习(8)---静态域与静态方法

    静态域:如果将域定义为static,每个类中只有一个这样的域.而每一个对象对于所有的实例域却都有自己的一份拷贝.例如,加入需要给每一个雇员赋予唯一的标识码.这里给的Employee类添加一个实例域id ...

  4. vim 常用的操作指令

    vim(vi improve).命令行下的一些常见操作: 移动光标: 0:将光标移动到该行的最前面: $:将光标移动到该行的最后面: G:移动到最后一行的开头: {/}:将光标移动到前面或者后面的{/ ...

  5. linux命令(6):tar命令

    压缩方法:tar zcvf test.tar.gz test [表示把文件夹目录压缩成test.tar.gz文件保存] 解压方法:tar zxvf test.tar.gz –C /home [表示解压 ...

  6. python IDE的配置

    本人使用过的两款,系统环境ubuntukylin 15.04 jupyter 主要参考:ref1 和 ref2 遇到问题: error: [I 21:48:41.947 NotebookApp] Wr ...

  7. cookie笔记(二)

    小荔枝 增 删 查 改 <form action="javascript:void(0)" method="get" accept-charset=&qu ...

  8. img加载不出来,给个默认图片。

    忽然发现,jq里也有坑,很多东西莫名其妙的被废弃了……所以,只能用原生js来做了: $('img').each(function() { if (!this.complete || typeof th ...

  9. 事务时间如何去掉wasted time

    事务时间如何去掉wasted time   事务时间 一个事务的时间是指持续时间,事务会完全记录下从事务开始到事务结束之间的时间差,那么事务的时间能真实地反映业务操作的时间吗?不能,就好像人用手按秒表 ...

  10. linux 进程命令小结

    top:动态查看进程的变化 ps:将某个时间点的进程运行情况选取下来 ps -l :仅查看自己的bash相关进程 ps -aux :查看系统所有的进程 pstree :列出目前系统上面所有的进程树的相 ...