lightoj 1229 - Treblecross 博弈论
思路: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 博弈论的更多相关文章
- LightOJ 1229 Treblecross(SG函数打表 + 遍历)题解
题意:给你一串含“.”和“X”的字串,每次一个玩家可以把‘."变成“X”,谁先弄到三个XXX就赢.假如先手必赢,输出所有能必赢的第一步,否则输出0. 思路:显然如果一个X周围两格有X那么肯定 ...
- 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 ...
- 爆零后的感受外加一道强联通分量HDU 4635的题解
今天又爆零了,又是又,怎么又是又,爆零爆多了,又也就经常挂嘴边了,看到这句话,你一定很想说一句””,弱菜被骂傻,也很正常啦. 如果你不开心,可以考虑往下看. 翻到E(HDU 4635 Strongly ...
- UVA 10561 Treblecross(博弈论)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209 [思路] 博弈论. 根据X分布划分禁区,每个可以放置的块为 ...
- lightoj 1296 - Again Stone Game 博弈论
思路:由于数据很大,先通过打表找规律可以知道, 当n为偶数的时候其SG值为n/2; 当n为奇数的时候一直除2,直到为偶数m,则SG值为m/2; 代码如下: #include<stdio.h> ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- IT人生知识分享:博弈论的理性思维
背景: 昨天看了<最强大脑>,由于节目比较有争议性,不知为什么,作为一名感性的人,就想试一下如果自己理性分析会是怎样的呢? 过程是这样的: 中国队(3人)VS英国队(4人). 1:李建东( ...
- LightOj 1298 - One Theorem, One Year(DP + 欧拉)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...
- [poj2348]Euclid's Game(博弈论+gcd)
Euclid's Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9033 Accepted: 3695 Des ...
随机推荐
- js_layer弹窗的使用和总结
2018-04-10 一张呈现给用户的网页,会有很多种交互,比如连不上网络,用户点击按钮时向后台请求数据不成功等等.像这些情况,用户是看不见的, 要给用户更好的体验,在特定的时间,给客户反馈内容.实时 ...
- 一个python拖库字段的小脚本
import requests import re all_column = dict() all_db = "db_zf,dg_activity,dg_activity_log,dg_ad ...
- C高级 框架开发中红黑树结构
引言 -- 红黑树历史 红黑树是数据结构学习中一道卡. 底层库容器中必不可少的算法. 历经各种实战运用,性能有保障. 同样红黑树不好理解, 就算理解了, 代码也不好写. 就算写了, 工程库也难构建. ...
- 使用Webpack搭建Vue项目
前提: 1. 借助Node.js环境里的npm来安装, 2. 设置好npm镜像, (比如淘宝的npm镜像:输入 引用 npm install -g cnpm –registry=https://r ...
- Leetcode 之Length of Last Word(37)
扫描每个WORD的长度并记录即可. int lengthOfLast(const char *s) { //扫描统计每个word的长度 ; while (*s) { if (*s++ != ' ')/ ...
- Flask 的系统学习
详细看地址: http://www.cnblogs.com/wupeiqi/articles/7552008.html 一. 说明 Flask是一个基于Python开发并且依赖jinja2模板和Wer ...
- AC日记——天天爱跑步 洛谷 P1600
天天爱跑步 思路: 树上差分+分层动态线段树: (伏地膜,跪烂xxy) 代码: #include <bits/stdc++.h> using namespace std; #define ...
- 前端读者 | CSS三角形和饼图
@羯瑞 三角形 .triangle{width:0;height:0;border-width:50px;border-style:solid;border-color:red blue green ...
- 虚拟机Visualbox安装CentOS
选择安装CentOS系统 进入了安装界面,选择语言,并选择继续 安装的主界面 1.先选择日期时间,选择了亚洲,并选择上海,再点击左上角的完成按钮 2.再选择键盘,选择英文 3.选择语言为英语 4.选择 ...
- HDU 6166 Senior Pan (最短路变形)
题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...