【UVA10561】Treblecross(SG函数)
题意:有n个格子排成一行,其中一些格子里面有字符X。两个游戏者轮流操作,每次可以选一个空格,在里面放上字符X。
如果此时有3个连续的X出现,则该游戏者赢得比赛。初始条件下不会有3个X连续出现。
判断先手胜负情况,若必胜则升序输出先手第一步的所有可选必胜策略
n<=200
思路:如果有XX或者X.X出现则一定先手胜
一个结论:X的旁边和旁边的旁边不能放X
于是整个游戏被不能放X的区域分成了若干个独立的片段,每次都可以选择一个片段进行游戏,就是若干个游戏的和
由于每个棋盘片段都是连续的,想到用一个正整数(即长度)来表示状态,g(x)表示由连续的x个格子组成的棋盘所对应的SG函数值
则有递推方程g(x)=mex(g(x-3),g(x-4),g(x-5),g(1)^g(x-6),g(2)^(x-7)……)
有了g函数,很容易算出初始局面的SG函数,所有使得后继专题SG值为0的决策即为所求
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
#define N 21000
#define oo 10000000
#define MOD 1000000007 int g[N],flag[N],b[N],c[N],d[N],n;
char a[N]; int isok(int x)
{
int k=;
a[x]='X';
for(int i=;i<=n-;i++)
{
if(a[i]=='X'&&a[i+]=='X'&&a[i-]=='.'){k=i-; break;}
if(a[i]=='X'&&a[i-]=='X'&&a[i+]=='.'){k=i+; break;}
if(a[i]=='.'&&a[i-]=='X'&&a[i+]=='X'){k=i; break;}
}
if(k)
{
a[x]='.';
return ;
}
for(int i=;i<=n;i++) b[i]=;
for(int i=;i<=n;i++)
if(a[i]=='X')
for(int j=-;j<=;j++)
if(i+j>&&i+j<=n) b[i+j]=;
int ans=;
int s=;
for(int i=;i<=n;i++)
if(b[i]==) s++;
else if(s)
{
ans^=g[s];
s=;
}
if(s) ans^=g[s];
a[x]='.';
if(ans) return ;
return ;
} int main()
{
//freopen("uva10561.in","r",stdin);
//freopen("uva10561.out","w",stdout);
g[]=;
g[]=g[]=g[]=;
g[]=g[]=;
for(int i=;i<=;i++)
{
memset(flag,,sizeof(flag));
for(int j=;j<=;j++) flag[g[i-j]]=;
for(int j=;j<=i;j++)
if(i-j>=) flag[g[j-]^g[i-j]]=;
int j=;
while(flag[j]) j++;
g[i]=j;
}
//for(int i=1;i<=200;i++) printf("%d %d\n",i,g[i]);
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%s",a+);
n=strlen(a+);
for(int i=;i<=n;i++) d[i]=;
for(int i=;i<=n-;i++)
{
if(a[i]=='X'&&a[i+]=='X'&&a[i-]=='.') d[i-]=;
if(a[i]=='X'&&a[i-]=='X'&&a[i+]=='.') d[i+]=;
if(a[i]=='.'&&a[i-]=='X'&&a[i+]=='X') d[i]=;
}
for(int i=;i<=n;i++) b[i]=;
for(int i=;i<=n;i++)
if(a[i]=='X')
for(int j=-;j<=;j++)
if(i+j>&&i+j<=n) b[i+j]=;
int ans=;
int s=;
for(int i=;i<=n;i++)
if(b[i]==) s++;
else if(s)
{
ans^=g[s];
s=;
}
if(s) ans^=g[s];
s=;
for(int i=;i<=n;i++) s+=d[i];
if(ans||s)
{
printf("WINNING\n");
int m=;
for(int i=;i<=n;i++)
if(a[i]=='.'&&isok(i)) d[i]=;
for(int i=;i<=n;i++)
if(d[i]) c[++m]=i;
for(int i=;i<=m-;i++) printf("%d ",c[i]);
printf("%d\n",c[m]);
}
else
{
printf("LOSING\n");
printf("\n");
}
}
return ;
}
【UVA10561】Treblecross(SG函数)的更多相关文章
- UVa 10561 Treblecross (SG函数)
题意:给定上一行字符串,其中只有 X 和 . 并且没有连续的三个 X,两个玩家要分别在 . 上放 X,如果出现三个连续的 X,则该玩家胜利,现在问你先手胜还是败,如果是胜则输出第一步可能的位置. 析: ...
- UVA10561 Treblecross —— SG博弈
题目链接:https://vjudge.net/problem/UVA-10561 题意: 两个人玩游戏,轮流操作:每次往里面添加一个X,第一个得到XXX的获胜. 题解: 详情请看<训练指南&g ...
- UVA10561 Treblecross 组合游戏/SG定理
Treblecross is a two player gamewhere the goal is to get three X in a row on a one-dimensional board ...
- UVA 10561 - Treblecross(博弈SG函数)
UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有 ...
- LightOJ 1229 Treblecross(SG函数打表 + 遍历)题解
题意:给你一串含“.”和“X”的字串,每次一个玩家可以把‘."变成“X”,谁先弄到三个XXX就赢.假如先手必赢,输出所有能必赢的第一步,否则输出0. 思路:显然如果一个X周围两格有X那么肯定 ...
- poj 3575 Crosses and Crosses(SG函数)
Crosses and Crosses Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3063 Accepted: 11 ...
- HDU 5795 A Simple Nim 打表求SG函数的规律
A Simple Nim Problem Description Two players take turns picking candies from n heaps,the player wh ...
- 【转】博弈—SG函数
转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...
- HDU 1848 Fibonacci again and again【SG函数】
对于Nim博弈,任何奇异局势(a,b,c)都有a^b^c=0. 延伸: 任何奇异局势(a1, a2,… an)都满足 a1^a2^…^an=0 首先定义mex(minimal excludant)运算 ...
随机推荐
- Q&A - ABTesting是啥?
举个简单的例子,当你有一个日IP过千的网站,而你的网站首页几百年没有更改了,这个时候你想启用新的网页,而你有害怕新的页面用户不一定就非常喜欢,那么这个时候你就需要进行A/B测试了.测试的方法是将老页面 ...
- Django之视图和URL配置
1.在创建项目时,Django会自动创建URL配置,在urls.py文件中 文件的默认内容如下所示: """mysite URL Configuration The ur ...
- MTCNN自己的学习理解
MTCNN 流程 经过三个网络 P-Net,R-Net,O-Net 对于P-Net: P-Net是一个全卷积层,不涉及到全连接层,所以我们的输入图像的尺寸可以是不固定的. 对于P-Net来说,我们的输 ...
- wireshark_1.6.2 使用笔记
表示ip1是否有访问ip2,进行抓包
- 在windows和Linux下安装nodejs
在windows下安装nodejs 1.首先下载nodejs安装包, https://nodejs.org/en/download/ 点击下载相应的版本 然后将文件夹解压到安装目录(任意,不做规定) ...
- Air Pollution【空气污染】
Air Pollution Since the 1940s, southern California has had a reputation for smog. 自20世纪40年代以来,南加利福尼亚 ...
- uva1422 二分法+优先队列贪心
题意:有n个任务,每个任务必须在在时刻[r, d]之内执行w的工作量(三个变量都是整数).处理器执行的速度可以变化,当速度为s时,一个工作量为w的任务需要 执行的时间为w/s个单位时间.另外不一定要连 ...
- 3224: Tyvj 1728 普通平衡树(finger tree)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 19122 Solved: 8359[Submit][St ...
- imageX
imageX 编辑 ImageX 是一个命令行工具,原始设备制造商 (OEM) 和公司可以使用它来捕获.修改和应用基于文件的磁盘映像以进行快速部署.ImageX 可以使用 Windows 映像 (.w ...
- 手机APP设计网
http://hao.xueui.cn/ http://www.25xt.com/