题意: 给出一个连续的棋盘,有的位置为'.',有的位置为'X',二者轮流下子,当有一方获得连续三个子的时候取胜。

  对于胜态,一种情况是当前局面出现"XX"/"X.X", 这样直接下一个子就获胜了。

  会发现,对于".......X......."这种情况,先手绝对不能在这个X的相邻两格子里落子,否则就会形成上述的胜态给对手。

在排除了这种情况之后,我们可以把棋盘先预处理掉"禁区"部分之后再分解为一块块连续的子棋盘,这些 子棋盘相当于一个个的子问题。另一种胜态的情况就是在某一个'.'处落子之后剩余棋盘的sg值,sg[S']==0而且没有呈现出胜态1的局面,那就说明对手必败。

  初始化sg[0]=0,sg[1]=sg[2]=sg[3]=1; 显然1、2、3时候无论落子到哪,剩下的位置都不能再放子了,也就是必败态(零态).

 #include<bits/stdc++.h>
using namespace std;
int n,sg[];
char s[];
bool v[],idx[];
bool ok(){
for(int i=;i<=n-;++i)
if(s[i]=='X'&&s[i+]=='X'&&s[i+]=='X') return ;
return ;
}
bool _ok(){
for(int i=;i<n;++i){
if(s[i]=='.'){
s[i]='X';
if(ok()) {
s[i]='.';
return ;
}
s[i]='.';
}
}
int ans=,tmp=;
for(int i=;i<n;++i){
if(s[i]=='X'||
(i->=&&s[i-]=='X')||
(i->=&&s[i-]=='X')||
(i+<n&&s[i+]=='X')||
(i+<n&&s[i+]=='X')){
ans^=sg[tmp];
tmp=;
}
else
tmp++;
}
//cout<<"tmp="<<tmp<<endl;
ans^=sg[tmp];
return ans==;
}
int main(){
int i,j,k,t,m;
sg[]=sg[]=sg[]=;
for(i=;i<=;++i){
memset(v,,sizeof(v));
for(j=;j<=i;++j){
v[sg[max(,j-)]^sg[max(,i-j-)]]=;
}
for(j=;;j++){
if(!v[j]){
sg[i]=j;
break;
}
}
}
cin>>t;
while(t--){
cin>>s;
n=strlen(s);
memset(idx,,sizeof(idx));
for(i=;i<n;++i){
if(s[i]=='.'){
s[i]='X';
if(ok() || _ok()) idx[i]=;
s[i]='.';
}
}
bool can=;
for(i=;i<n;++i) if(idx[i]) can=;
if(!can) puts("LOSING\n");
else{
puts("WINNING");
for(i=;i<n;++i)
if(idx[i]){
cout<<i+;
break;
}
for(i++;i<n;++i)
if(idx[i]){
cout<<" "<<i+;
}
cout<<endl;
}
}
return ;
}
/*
5
.X....XX.. .... ..XX.. ..... ..X.X.. ... ..XX.. ................ ..XX.. ... ..X.. ..... ..X
*/
/*
4
.....
X.....X..X.............X....X..X
.X.X...X
...............................................
*/

  

uva-10561-nim的更多相关文章

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

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

  2. UVa 10561 - Treblecross

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

  3. UVa 11859 (Nim) Division Game

    把每一行m个数所有的素因子看做一堆,就把问题转化为n堆的Nim游戏. 然后预处理一下10000以内每个数素因数的个数,再根据书上的Bouton定理,计算一下n行素因数个数的异或和. 为0是先手必败局面 ...

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

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

  5. UVA 10561 Treblecross(博弈论)

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

  6. UVa 10561 Treblecross (SG函数)

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

  7. Treblecross(uva 10561)

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

  8. uva 10561 sg定理

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

  9. Division Game UVA - 11859 Nim

    Code: #include<cstdio> #include<algorithm> using namespace std; #define maxn 10005 int n ...

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

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

随机推荐

  1. 处理内容有&特殊字符thinkphp返回xml无法解析的问题<![CDATA[xxx]]>

    处理内容有&特殊字符thinkphp返回xml无法解析的问题<![CDATA[xxx]]> // xml 转义特殊字符 如&'" <![CDATA[&quo ...

  2. tomcat 9.0.4 性能调优

    参考了网上的一些优化参数,但是在启动中发现 有2个报错: 11-Feb-2018 15:57:23.293 警告 [main] org.apache.catalina.startup.SetAllPr ...

  3. 上周日选拔题部分write up

    ---恢复内容开始--- 第一题.平淡无奇的签到题,“百度一下,你就知道”,打开之后会弹出一个百度的网页页面.网页题第一步,先查看它的源代码.从上往下看,发现了这样一行字 看起来有点像base编码,于 ...

  4. Problem F: 等式

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 104  Solved: 22[Submit][Status][Web Board] Descriptio ...

  5. Win7系统中如何查看当前文件被哪一个程序占用了

    https://superuser.com/questions/117902/find-out-which-process-is-locking-a-file-or-folder-in-windows ...

  6. 【入门详解】MyBatis入门基础详解

    什么是mybatis? MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XM ...

  7. 【第十四章】 springboot + profile(不同环境读取不同配置)

    具体做法: 不同环境的配置设置一个配置文件,例如:dev环境下的配置配置在application-dev.properties中:prod环境下的配置配置在application-prod.prope ...

  8. Linux 安装 mysql 转 http://www.cnblogs.com/fnlingnzb-learner/p/5830622.html

    到mysql官网下载mysql编译好的二进制安装包,在下载页面Select Platform:选项选择linux-generic,然后把页面拉到底部,64位系统下载Linux - Generic (g ...

  9. Python 实现协程

    协程的概念 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.(其实并没有说明白~) 我觉得单说协程,比较抽象,如果对线程有一定了解的话,应该就比较 ...

  10. An error occurred during installation: No such plugin: cloudbees-folder

    解决办法:下载cloudbees-folder.hpi放在目录/usr/local/tomcat/webapps/jenkins/WEB-INF/detached-plugins/下,重启tomcat ...