UVA 10561 Treblecross(博弈论)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209
【思路】
博弈论。
根据X分布划分禁区,每个可以放置的块为单独一个游戏。按长度定义状态,构造sg函数。依次试验每一种放法。
【代码】
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std; const int N = +; int g[N],n; int mex(vector<int>& s) {
if(s.empty()) return ;
sort(s.begin(),s.end());
if(s[]) return ;
for(int i=;i<s.size();i++)
if(s[i]>s[i-]+) return s[i-]+;
return s[s.size()-]+;
}
void get_g() {
g[]=; g[]=g[]=g[]=;
for(int i=;i<=N-;i++) {
vector<int> s;
s.push_back(g[i-]);
s.push_back(g[i-]);
if(i>=) s.push_back(g[i-]);
for(int j=;j<i-;j++)
s.push_back(g[j-] ^ g[i-j-]);
g[i]=mex(s);
}
} bool winning(char *s) {
int n=strlen(s);
for(int i=;i<n-;i++)
if(s[i]=='X' && s[i+]=='X' && s[i+]=='X') return false;
int no[N];
memset(no,,sizeof(no));
no[n]=;
for(int i=;i<n;i++) if(s[i]=='X') {
for(int d=-;d<=;d++)
if(i+d>= && i+d<n) {
if(d!= && s[i+d]=='X') return true;
no[i+d]=;
}
} int sg=;
int start=-;
for(int i=;i<=n;i++) {
if(start< && !no[i]) start=i;
if(no[i] && start>=) sg^=g[i-start];
if(no[i]) start=-;
}
return sg!=;
} int main() {
get_g();
int T; scanf("%d",&T);
while(T--) {
char s[N];
scanf("%s",s);
int n=strlen(s);
if(!winning(s)) puts("LOSING\n");
else {
puts("WINNING");
bool first=;
for(int i=;i<n;i++) if(s[i]=='.') {
s[i]='X';
if(!winning(s))
if(first) printf("%d",i+) , first=;
else printf(" %d",i+);
s[i]='.';
}
putchar('\n');
}
}
return ;
}
UVA 10561 Treblecross(博弈论)的更多相关文章
- UVA 10561 - Treblecross(博弈SG函数)
UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有 ...
- UVa 10561 - Treblecross
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVa 10561 Treblecross (SG函数)
题意:给定上一行字符串,其中只有 X 和 . 并且没有连续的三个 X,两个玩家要分别在 . 上放 X,如果出现三个连续的 X,则该玩家胜利,现在问你先手胜还是败,如果是胜则输出第一步可能的位置. 析: ...
- UVa 10561 (SG函数 递推) Treblecross
如果已经有三个相邻的X,则先手已经输了. 如果有两个相邻的X或者两个X相隔一个.,那么先手一定胜. 除去上面两种情况,每个X周围两个格子不能再放X了,因为放完之后,对手下一轮再放一个就输了. 最后当“ ...
- Treblecross(uva 10561)
题意:一个 1 × n 的棋盘,有 X 和 :,当棋盘上出现三个连续的X 时游戏结束,两人轮流操作,每次能把一个 : 变成 X,问先手必胜方案数以及先手可以放的位置. /* 对于先手,当有一个'X'时 ...
- uva 10561 sg定理
Problem C Treblecross Input: Standard Input Output: Standard Output Time Limit: 4 Seconds Treblecros ...
- lightoj 1229 - Treblecross 博弈论
思路:SG函数 枚举先手的每一个位置是否有必胜. 1)如果出现了XXX则必胜: 2)如果出现了XX或X.X则必败: 3)否则计算后手的sg值和. 代码如下: #include<iostream& ...
- .Uva&LA部分题目代码
1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...
- UVa 1378 A Funny Stone Game [博弈论 SG函数]
A Funny Stone Game 题意: $n \le 23$堆石子,每次选择$i < j \le k$,从$i$拿走1颗$j,k$各放入一颗,不能取就失败.求先手是否必胜以及第一次取的策略 ...
随机推荐
- T-SQL切割字符串方法小结 2
有表tb, 如下: id value ----------- ----------- 1 aa,bb 2 aaa,bbb,ccc 欲按id,分拆value列, 分拆后结果如下: id value -- ...
- PL/SQL 中文转换为\uxxxx格式(unicode)
用plsql生成json的时候,经常要处理中文的情况. SELECT replace(asciistr('你好,,hello'),'\','\u') FROM dual 输出:\u4F60\u597D ...
- 使用Gulp构建本地开发Web服务器
前端模拟ajax,就需要配置web服务器(apache,iis,nginx),有点麻烦 代码有一点点修改,就需要F5刷新页面很麻烦 Gulp + Gulp-connect + watch + live ...
- 345. Reverse Vowels of a String(C++)
345. Reverse Vowels of a String Write a function that takes a string as input and reverse only the v ...
- 测试functional的bind以及相关功能
注:在VS2010 UPDATE1下测试通过 /*测试functional的bind以及相关功能*/ #include <iostream> #include <functional ...
- 24种设计模式--门面模式【Facade Pattern】
大家都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的 ...
- DateTimePicker时间控件:
DateTimePicker时间控件: http://xdsoft.net/jqplugins/datetimepicker/ 可以参考文档设置各种属性,格式. 用法: 首先下载datetimepic ...
- php hook example
http://www.thinkphp.cn/code/337.html http://blog.micxp.com/index.php/archives/63/
- jquery前端性能优化(持续添加。。。)
1.选择器的使用 (1)$('#id') 使用id来定位dom元素是性能最高的方法.jQuery底层将直接调用本地方法document.getElementById().如果id直接可以找到所要对 ...
- C# 数据结构 基础 论述
问题: 信息世界中,计算机是加工处理的信息的载体,在这个过程中面临着三个问题: 1.如何方便高效的组织数据 2.如何在计算机中存储数据(内存和外存) 3.如何对存储的数据进行高效的操作 目的: 我们都 ...