题目链接

\(Description\)

有一个一行n列的棋盘,每个人每次往上放一个棋子,将三个棋子连在一起的人赢。问是否有必胜策略。

\(Solution\)

首先一个人若在\(i\)处放棋子,那么另一个人就不能在\(i-2,i-1,i+1,i+2\)处放石子,这样会使对方赢。

那么可以看做:在\(i\)处放棋子后,另一个人不能选择\(i-2,i-1,i+1,i+2\)处放石子,不能放的人输。

可以联想到Nim游戏,一个人取一个石子,另一个人可取石子\(-2\);同时是产生两个局面

即1*n的棋盘上 在i处放棋子,会将游戏划分成\(s(i-3)+s(n-i-2)\)两个游戏

那这就是Multi-SG游戏,用SG函数解决。

记忆化,\(O(n^2)\).

Multi-SG游戏:

详细见这

Def: 在符合拓扑原则的前提下,一个单一游戏的后继可以为多个单一游戏。其余规则与SG游戏相同。

对于一个单一游戏,不同方法可能会将其划分为多个单一游戏。每一方法对应的多个单一游戏的(异或)和即可表示这种方法的NP状态。

而这个单一游戏的SG值为其所有方法的SG值的mex

//1692K 266MS
#include <cstdio>
#include <cstring>
const int N=2002; int n,sg[N]; int Get_SG(int x)
{
if(x<0) return 0;
if(~sg[x]) return sg[x];
bool vis[N];
memset(vis,0,sizeof vis);
for(int i=1; i<=x; ++i)//放所有位置都是子局面
vis[Get_SG(i-3)^Get_SG(x-i-2)]=1;//x为偶数时会有重 不过记忆化 无妨
for(int i=0; ; ++i)
if(!vis[i]) return sg[x]=i;
} int main()
{
while(~scanf("%d",&n))
memset(sg,0xff,sizeof sg), puts(Get_SG(n)?"1":"2");
return 0;
}

POJ.3537.Crosses and Crosses(博弈论 Multi-SG)的更多相关文章

  1. poj 3537 Crosses and Crosses 博弈论之grundy值

    题意: 给1*n的格子,轮流在上面叉叉,最先画得3个连续叉叉的赢.问先手必胜还是必败. 分析: 求状态的grundy值(也就是sg值),详细怎么求详见代码.为什么这么求要自己想的,仅仅可意会(别人都说 ...

  2. 【POJ】【3537】Crosses and Crosses

    博弈论 相当于放了x的位置,左右4格都不能再放x了,谁无处可放就输. n<=2000 直接枚举后继状态,暴力求SG函数即可. 例: 0000000->x..0000 / .x..000 / ...

  3. POJ 3537 Crosses and Crosses

    Crosses and Crosses Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2237 Accepted: 821 Ca ...

  4. poj 3575 Crosses and Crosses(SG函数)

    Crosses and Crosses Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3063   Accepted: 11 ...

  5. POJ 3537 Crosses and Crosses (NEERC)

                      Crosses and Crosses Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4 ...

  6. POJ 3537 multi-sg 暴力求SG

    长为n的一列格子,轮流放同种棋子,率先使棋子连成3个者胜. 可以发现每次放一个棋子后,后手都不能放在[x-2,x+2]这个区间,那么相当于每次放棋将游戏分成了两个,不能放棋者败. 暴力求SG即可 /* ...

  7. [poj3537]Crosses and Crosses_博弈论

    Crosses and Crosses poj-3537 题目大意:给定一个1*n的网格,每次往格子内填一个$\times$,连续的三个即可获胜. 注释:$1\le n\le 2000$. 想法:我们 ...

  8. POJ 2425 A Chess Game 博弈论 sg函数

    http://poj.org/problem?id=2425 典型的sg函数,建图搜sg函数预处理之后直接求每次游戏的异或和.仍然是因为看不懂题目卡了好久. 这道题大概有两个坑, 1.是搜索的时候vi ...

  9. POJ.1067 取石子游戏 (博弈论 威佐夫博弈)

    POJ.1067 取石子游戏 (博弈论 威佐夫博弈) 题意分析 简单的威佐夫博弈 博弈论快速入门 代码总览 #include <cstdio> #include <cmath> ...

  10. [poj 3537]Crosses and Crosses(博弈论)

    题目:http://poj.org/problem?id=3537 题意:给你n个格子,两个人依次在n个格子的任意空位置画"X",谁如果画了一个后,3个X连在了一起,那么那个人就获 ...

随机推荐

  1. linux服务器last查看关机记录

    1.查看重启记录 last reboot命令 [root@test ~]# last reboot reboot system boot -.el6.x Mon May : - : (+:) rebo ...

  2. 一个有趣的小例子,带你入门协程模块-asyncio

    一个有趣的小例子,带你入门协程模块-asyncio 上篇文章写了关于yield from的用法,简单的了解异步模式,[https://www.cnblogs.com/c-x-a/p/10106031. ...

  3. art 校准时设备端操作

    (1)准备所需文件art.ko  和 nart.out (2)配置设备的IP地址(例如:192.168.2.122),使之能与本地PC通信 (3)上传文件到设备 cd /tmp tftp -g -r ...

  4. zabbix客户端日志报错no active checks on server [192.168.3.108:10051]: host [192.168.3.108] not found

    zabbix客户端日志报错: 45647:20160808:220507.717 no active checks on server [192.168.3.108:10051]: host [192 ...

  5. windows 7安装apache

    最近想在PHPEclipse 上开发PHP项目,但遇到的一个问题是:无法在Web 上浏览PHP页面,更谈不上调试了.这一点让人很是纠结,在浏览网上大量的相关内容后,该问题已经解决. 具体的操作过程详见 ...

  6. UITableView滑动性能优化扩展

    一点UITableView滑动性能优化扩展 影响UITableView的滑动,有哪些因素呢?  关于这一点,人眼能识别的帧率是60左右,这也就是为什么,电脑屏幕的最佳帧率是60Hz.  屏幕一秒钟会刷 ...

  7. Ext.util.Format.date与Ext.Date.format区别, 转换时间戳

    在Extjs中装时间戳使用如下两种都可以: Ext.util.Format.date(time,'U'); Ext.Date.format(time, 'U'); 为了找到它们的区别,查看源代码,以E ...

  8. OCM_第七天课程:Section3 —》数据库可用性

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  9. window 连linux

    https://blog.csdn.net/ruanjianruanjianruan/article/details/46954681 https://blog.csdn.net/u013754317 ...

  10. poj1742 多维背包

    普通的多维背包做不了,需要优化一下 但是没有学优化..别的方法也是可以做的 省去一个 表示阶段的 i 维度,dp[j]表示面值为j的钱是否被凑出来了,used[j]表示第i种硬币在凑面值为j的时候被用 ...