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 ...
随机推荐
- Python标准库笔记(4) — collections模块
这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的dict namedtuple 生成可以使用名字来访问元素内容的tuple子类 ...
- [Leetcode Week15]Populating Next Right Pointers in Each Node
Populating Next Right Pointers in Each Node 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/populati ...
- selenium===介绍
selenium 是支持java.python.ruby.php.C#.JavaScript . 从语言易学性来讲,首选ruby ,python 从语言应用广度来讲,首选java.C#.php. 从语 ...
- 实验室项目.md
1 嵌入式操作系统 为什么要用嵌入式操作系统 普通的单片机编程:程序(软件)--单片机硬件: 嵌入式操作系统开发:程序(软件)--操作系统--嵌入式硬件(包括单片机等); 我们平时普通所学的单片机编程 ...
- caffe solver.prototxt 生成
from caffe.proto import caffe_pb2 s = caffe_pb2.SolverParameter() path='/home/xxx/data/' solver_file ...
- network-scoket
server: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- [hadoop][会装]zookeeper安装
1.简介 分布式场景下的各个进程间的协调运作离不开zookeeper, zookeeper已经是大数据领域提供分布式协调服务的事实标准. 本文只介绍zookeeper的安装方法. 2. 节点规划如下: ...
- 使用while循环遍历文件
/* 使用while循环遍历文件*/ [root@localhost test1]# vim 17.py //add #!/usr/bin/python ll = open('/tmp/1.txt') ...
- PHP7.3发布啦
作为PHP5的最后一个版本,也是目前使用最广泛的PHP版本,PHP 5.6始于公元2014年(不是1804年,嘿嘿),其第一个测试版PHP 5.6 alpha 1版于2014年1月发布.随机产生了第一 ...
- [水煮 ASP.NET Web API2 方法论](1-6)Model Validation
问题 想要 ASP.NET Web API 执行模型验证,同时可以和 ASP.NET MVC 共享一些验证逻辑. 解决方案 ASP.NET Web API 与 ASP.NET MVC 支持一样的验证机 ...