uva-10561-nim
题意: 给出一个连续的棋盘,有的位置为'.',有的位置为'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的更多相关文章
- 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 11859 (Nim) Division Game
把每一行m个数所有的素因子看做一堆,就把问题转化为n堆的Nim游戏. 然后预处理一下10000以内每个数素因数的个数,再根据书上的Bouton定理,计算一下n行素因数个数的异或和. 为0是先手必败局面 ...
- UVa 10561 (SG函数 递推) Treblecross
如果已经有三个相邻的X,则先手已经输了. 如果有两个相邻的X或者两个X相隔一个.,那么先手一定胜. 除去上面两种情况,每个X周围两个格子不能再放X了,因为放完之后,对手下一轮再放一个就输了. 最后当“ ...
- UVA 10561 Treblecross(博弈论)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32209 [思路] 博弈论. 根据X分布划分禁区,每个可以放置的块为 ...
- UVa 10561 Treblecross (SG函数)
题意:给定上一行字符串,其中只有 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 ...
- Division Game UVA - 11859 Nim
Code: #include<cstdio> #include<algorithm> using namespace std; #define maxn 10005 int n ...
- .Uva&LA部分题目代码
1.LA 5694 Adding New Machine 关键词:数据结构,线段树,扫描线(FIFO) #include <algorithm> #include <cstdio&g ...
随机推荐
- 根据wsdl文件,soupUI生成webservice客户端代码
根据wsdl文件,soupUI生成webservice客户端代码 功能介绍: 对于面向WebServie接口开发时,当我们已经获取到WSDL文件后,可以使用soapUI工具生成对应的客户端和服务端代码 ...
- 20145206邹京儒 Exp8 Web基础
20145206邹京儒 Exp8 Web基础 一.实践过程记录 Apache (一)环境配置 1.查看端口占用:在这里apach2占用端口80 2.测试apache是否正常工作:在kali的火狐浏览器 ...
- keil5配置stm32库函数开发
在将模板文件添加到工程中后, 1.点击魔术棒,选择C/C++,添加头文件的路径: 2.C/C++里面的define内填入:STM32F10X_MD,USE_STDPERIPH_DRIVER: 3.Ou ...
- JS 获取浏览器的宽和高
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- IE6里样式表不起作用解决方法
写的html页面引用外部css文件的时候在IE7,IE8和FF中能正常作用,即能正常显示,可在IE6中却完全没有作用到,即css文件里的样式根本未被解析到我们的html页面,这是什么原因? 开 始把c ...
- POJ 3687 Labeling Balls(拓扑排序)题解
Description Windy has N balls of distinct weights from 1 unit to N units. Now he tries to label them ...
- BZOJ5281: [Usaco2018 Open]Talent Show 01分数规划+01背包
Description FarmerJohn要带着他的N头奶牛,方便起见编号为1…N,到农业展览会上去,参加每年的达牛秀!他的第i头奶牛重 量为wi,才艺水平为ti,两者都是整数.在到达时,Farme ...
- UVa 242 邮票和信封(完全背包)
https://vjudge.net/problem/UVA-242 题意: 输入s(每个信封能粘贴的最多邮票数量)和若干邮票组合,选出最大连续邮资最大的一个组合(最大连续邮资也就是用s张以内的邮票来 ...
- python 时间元组转时间戳
#!/usr/bin/python # -*- coding: UTF- -*- import time print(time.mktime((, , , , , , , , ))) 输出 15382 ...
- Goroutines和Channels(一)
Go语言中的并发程序可以用两种手段来实现.本章讲解goroutine和channel,其支持“顺序通信进程”(communicating sequential processes)或被简称为CSP.C ...