UVa 10561 - Treblecross
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的更多相关文章
- UVA 10561 - Treblecross(博弈SG函数)
UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有 ...
- UVA 10561 Treblecross(博弈论)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209 [思路] 博弈论. 根据X分布划分禁区,每个可以放置的块为 ...
- 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 ...
- .Uva&LA部分题目代码
1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...
- uva 1354 Mobile Computing ——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGcAAANuCAYAAAC7f2QuAAAgAElEQVR4nOy9XUhjWbo3vu72RRgkF5
- UVA 10564 Paths through the Hourglass[DP 打印]
UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...
随机推荐
- postgresql如何实现group_concat功能
MySQL有个聚集函数group_concat, 它可以按group的id,将字段串联起来,如 表:id name---------------1 A2 B1 B SELECT id, group_c ...
- 【Todo】【转载】Spark学习 & 机器学习(实战部分)-监督学习、分类与回归
理论原理部分可以看这一篇:http://www.cnblogs.com/charlesblc/p/6109551.html 这里是实战部分.参考了 http://www.cnblogs.com/shi ...
- iframe页面调用父窗口JS函数
A页面iframe 页面B, 此时 如果要在B页面调用父页面A的函数 B页面写法 parent.functionName(); 错误1: 解决办法 var js_domain_async = 'bai ...
- Java中for循环遍历List的两种方法
我们平常使用的方法: List<WebElement> element = driver.findElements(By.tagName("input")); ...
- jQuery封装函数
//1,插件命名:jQuery.插件名.js 为拉避免和其他库的冲突// //2,自定义插件尽量避免使用$ 如果非要使用$就一定要将jQuery传递进去,//写在最后加一个小括号写jquery ;结束 ...
- python操作mongodb之四cp数据库
from pymongo import MongoClient #连接数据库 client=MongoClient('192.168.30.252',27017) #获取现有数据库的名称 client ...
- michael的沟通秘籍
1 多准备几个邮件模板2 lower expectation over delivery less promise extra give3 involve resource earliar 尽早接手公 ...
- Rest接口中正则表达式
匹配所有字符: @Path("/server/{urlParam: .*}")
- 用ildasm/ilasm修改IL代码
原文地址:http://www.cnblogs.com/dudu/archive/2011/05/17/ildasm_ilasm_il.html 在开发中遇到这样一个场景,需要修改一个dll文件(.N ...
- node服务器获取form表单
搭建好服务器后 (前言,本文只是介绍form表单直接提供给 本页面数据,即在不刷新页面的前提下更改数据) 在public里面添加index.html <!DOCTYPE html> < ...