http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1502

博弈 SG  不可以使出现 XX 或者 X.X的情况,这样下一个人就赢了

枚举每个.将其变成X 看是否可以让对手输

1,已经出现了  XXX  对手已输

2,如果正好出现了  XX 或者 X.X  对手赢

3,如果一个地方的.变成X   不会出现XX或者X.X  把这些地方分成一个个的段   SG

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue> #define ll long long
#define lint long long
using namespace std; const int N=205;
int sg[N];
int dp(int x)
{
if(sg[x]!=-1)
return sg[x];
if(x==0)
return (sg[x]=0);
bool ok[N];
memset(ok,false,sizeof(ok));
for(int i=1;i<=x;++i)
{
int k=(dp(max(0,i-3))^dp(max(0,x-i-2)));
ok[k]=true;
}
for(int i=0;i<N;++i)
if(!ok[i])
{sg[x]=i;break;}
return sg[x];
}
bool ok(string s)
{
for(unsigned int i=0;i<s.size()-2;++i)
{
if(s[i]=='X'&&s[i+1]=='X'&&s[i+2]=='X')
return true;
}
return false;
}
bool ok1(string s)
{
for(unsigned int i=0;i<s.size();++i)
if(s[i]=='.')
{
s[i]='X';
if(ok(s))
return false;
s[i]='.';
}
int nim=0;
int tmp=0;
for(unsigned int i=0;i<s.size();++i)
{
if(s[i]=='X'||(i>=1&&s[i-1]=='X')||(i>=2&&s[i-2]=='X')||(i+1<s.size()&&s[i+1]=='X')||(i+2<s.size()&&s[i+2]=='X'))
{nim=(nim^dp(tmp));tmp=0;}
else
++tmp;
}
nim=(nim^dp(tmp));
if(nim==0) return true;
return false;
}
void solve(vector<int> &vt,string &s)
{
for(unsigned int i=0;i<s.size();++i)
if(s[i]=='.')
{
s[i]='X';
if(ok(s)||ok1(s))
vt.push_back(i+1);
s[i]='.';
}
}
int main()
{
//freopen("data.in","r",stdin);
memset(sg,-1,sizeof(sg));
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
vector<int>vt;
solve(vt,s);
if(vt.size()==0)
cout<<"LOSING"<<endl;
else
cout<<"WINNING"<<endl;
for(unsigned int i=0;i<vt.size();++i)
{
if(i>0) cout<<" ";
cout<<vt[i];
}
cout<<endl;
}
return 0;
}

UVa 10561 - Treblecross的更多相关文章

  1. UVA 10561 - Treblecross(博弈SG函数)

    UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有 ...

  2. UVA 10561 Treblecross(博弈论)

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

  3. UVa 10561 Treblecross (SG函数)

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

  4. UVa 10561 (SG函数 递推) Treblecross

    如果已经有三个相邻的X,则先手已经输了. 如果有两个相邻的X或者两个X相隔一个.,那么先手一定胜. 除去上面两种情况,每个X周围两个格子不能再放X了,因为放完之后,对手下一轮再放一个就输了. 最后当“ ...

  5. Treblecross(uva 10561)

    题意:一个 1 × n 的棋盘,有 X 和 :,当棋盘上出现三个连续的X 时游戏结束,两人轮流操作,每次能把一个 : 变成 X,问先手必胜方案数以及先手可以放的位置. /* 对于先手,当有一个'X'时 ...

  6. uva 10561 sg定理

    Problem C Treblecross Input: Standard Input Output: Standard Output Time Limit: 4 Seconds Treblecros ...

  7. .Uva&LA部分题目代码

    1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...

  8. uva 1354 Mobile Computing ——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5

  9. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

随机推荐

  1. JS自总结

    1.js获得当前元素   event.srcElement:   获取当前父元素   event.srcElement.parentElement   var rowIndex = e.parentE ...

  2. Oracle数据库高级查询(五)集合查询

    现实需求有时候需要将多个查询组合到一个查询中去 这时就需要使用集合查询操作了 这个操作类似于数学中的交集,并集,和补集的操作   交集就是返回两个查询共有的记录,关键字是INTERSECT 并集是返回 ...

  3. C++中的虚继承 & 重载隐藏覆盖的讨论

    虚继承这个东西用的真不多.估计也就是面试的时候会用到吧.. 可以看这篇文章:<关于C++中的虚拟继承的一些总结> 虚拟基类是为解决多重继承而出现的. 如:类D继承自类B1.B2,而类B1. ...

  4. Linux系统负载排查

    参考  http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html 在Linux系统中,我们一般使用uptime命 ...

  5. Android手机分辨率基础知识(DPI,DIP计算)二

    dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...

  6. 提高iOS开发效率的第三方框架等

    http://zhangmingwei.iteye.com/blog/2208783 http://www.kuqin.com/shuoit/20150703/346900.html

  7. goLang文件遍历

    package main import (  "fmt"  "io/ioutil"  "os"  "path/filepath&q ...

  8. js 高程(三)学习感言(随时更新)

    1.读第二遍了,感觉第一遍白读了. 2.现在还处于初学...

  9. sql语句语法大全

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  10. Maven最佳实践:划分模块

    http://juvenshun.iteye.com/blog/305865 ************************************* "分天下为三十六郡,郡置守,尉,监& ...