关于sg函数:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561007.html

题目链接:http://poj.org/problem?id=2311

思路:

就我而言,首先遇到的第一个问题就是抽象不出博主在《Game theory初步》(在前面那个网址的基础上向前找博主的前几篇博客就可以找到)这篇中讲的ICG(公平组合游戏)模型,因为如果纸片出现了1*1就结束了,而其他的纸片却不一定都是1*1的纸片,如果我们把一个纸片抽象成一个游戏图上的点,也就是说有些点还可以决策,但游戏却已经结束了,这明显和ICG的定义是违背的。

后来看了dicuss之后恍然大悟,对于任意一个选手来讲,肯定不会优先生成1*n或者n*1的纸片,因为下一轮对方就可以取胜,因此,如果这样不断的剪下去的话,最终肯定有一个局面都是3*2、2*3、2*2的纸片,实际上这时就可以断定输赢了,同时如果我们把3*2、2*3、2*2都看成终止状态的话,就巧妙避免了上面所提到的问题,因为这样游戏终止时不会有尚未决策的点。

单单解决完上一个问题还是不够的,接下来我又遇到了另一个问题,就是之前只做过一些裸的类似Nim游戏的题目,这些题目很容易将游戏转化成图游戏(即一个或若干个棋子初始时在某些特定的位置,每次将一个棋子通过一条有向边移到另一个位置,当所有棋子都不能移动的时候,游戏就终止了),但这个问题就不一样了,如果我们将一个w*h的纸片看做点(w,h),假如一种切的方式是生成(a,b)和(c,d)两个纸片,那岂不成了当一个棋子在(w,h)这个点的时候,有一种决策是让这个棋子分裂成两个棋子,其中一个移到(a,b),另一个移到(c,d)么?这要怎么搞呢?我瞬间就晕了……

结果今天早晨起床的时候却突然悟到了一些,实际上也主要是这时思考的时候就把游戏和的概念联系起来一起思考了。对于位于(w,h)这个位置的棋子而言,如果变成两个分别位于(a,b)和(c,d)的棋子,这两个棋子是不能各自看成(w,h)的后继的,因为后继之间应该是相互独立的,即既可以通过决策到达其中一个位置,也可以通过决策到达另一个位置,所以我们要将这两个棋子合起来考虑,共同看成是(w,h)的一个后继。同时结合游戏和的一些知识,(a,b)以及(c,d)是不是可以看成(w,h)的两个子游戏呢?当然可以,因为后面无论是对(a,b)还是(c,d)进行决策,都合对(w,h)进行决策的规则是一样的。那么对于(a,b)和(c,d)共同看成一个后继来讲,这个后继的SG函数值就应该是SG(a,b)^SG(c,d)。

至此为止,我们就终于把这个剪纸片问题化归成和一些简单的Nim游戏类似的形式了,其余的求解过程就和一些简单的Nim游戏的求解过程一样了。

以上内容摘自博客:http://www.cnblogs.com/staginner/archive/2012/02/26/2368417.html

代码:

 #include <stdio.h>
#include <string.h>
#define MAXN 210
using namespace std; int sg[MAXN][MAXN]; int dfs(int x, int y){
int vis[MAXN];
memset(vis, , sizeof(vis));
if(sg[x][y]!=-){//当前点已经走过
return sg[x][y];
}
for(int i=; i<=x-i; i++){//如果遍历到1,2的状态则必输,求赢自然可以从3开始遍历
vis[dfs(i, y)^dfs(x-i, y)]=;//母图可以由子图异或得到
}
for(int i=; i<=y-i; i++){
vis[dfs(x, i)^dfs(x, y-i)]=;
}
for(int i=; ; i++){
if(vis[i]==){//求mex值
sg[x][y]=sg[y][x]=i;
return i;
}
}
} int main(void){
int n, m;
memset(sg, -, sizeof(sg));
sg[][]=sg[][]=sg[][]=;//必输状态
while(~scanf("%d%d", &n, &m)){
if(dfs(n, m)){
puts("WIN");
}else{
puts("LOSE");
}
}
return ;
}

poj2133(sg函数)的更多相关文章

  1. HDU 5795 A Simple Nim 打表求SG函数的规律

    A Simple Nim Problem Description   Two players take turns picking candies from n heaps,the player wh ...

  2. 【转】博弈—SG函数

    转自:http://chensmiles.blog.163.com/blog/static/12146399120104644141326/ http://blog.csdn.net/xiaofeng ...

  3. 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)运算 ...

  4. POJ2425 A Chess Game[博弈论 SG函数]

    A Chess Game Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 3917   Accepted: 1596 Desc ...

  5. bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用

    1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 973  Solved: 599[Submit][Status ...

  6. BZOJ1188 [HNOI2007]分裂游戏(SG函数)

    传送门 拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数.看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做. 这道题需要奇特的模型转换.即把每一个石子当做一堆石子,且原来在第i堆 ...

  7. sg函数与博弈论2

    参考链接: http://blog.sina.com.cn/s/blog_51cea4040100h3l9.html 这篇主要就是讲anti-sg.multi-sg和every-sg的. 例1 poj ...

  8. sg函数与博弈论

    这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手 ...

  9. hdu1536&&hdu3023 SG函数模板及其运用

    S-Nim Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status ...

随机推荐

  1. android:PopupWindow的使用场景和注意事项

    1.PopupWindow的特点 借用Google官方的说法: "A popup window that can be used to display an arbitrary view. ...

  2. EasyDarwin手机直播转发快速显示问题之音频处理过程

    前言 在我们前面一篇<EasyDarwin手机直播是如何实现的快速显示视频的方法>中,我们描述到了EasyDarwin流媒体服务器端是如何对视频H.264进行缓冲,再以最快的方式将最新的视 ...

  3. 关于java的线程

    1 java的线程也是一个对象 所以,java线程对象也是由gc销毁的. 2 java线程对象等待被销毁的时机 当java线程执行完run()方法之后就在等待被销毁了,所以要一个线程对象不被销毁唯一的 ...

  4. mybatis入门(四)

    mybatis入门 需求:根据id查询用户的信息 mysql数据库: CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `us ...

  5. 什么是aop?-------转

    什么是AOP?  http://www.cnblogs.com/zhugenqiang/archive/2008/07/27/1252761.html#commentform(转) AOP(Aspec ...

  6. 正则表达式测试工具之Regex Match Tracer

    下载地址:http://www.regex-match-tracer.com/downloads 使用示例1:匹配 使用示例2:替换

  7. Java中实现函数的阻塞

    使用Object.wait()即可实现阻塞,使用Object.notify()解除阻塞,代码示例如下 MainFrame.java import javax.swing.JFrame; import ...

  8. APP上线审核注意事项

    基本要点 ·         不能导致手机故障(比如崩溃或屏幕问题) ·         长时间/过度使用之后反应仍然很快 ·         应用内的所有价格信息中不能用固定值代替可变变量 ·    ...

  9. Android Weekly Notes Issue #242

    Android Weekly Issue #242 January 29th, 2017 Android Weekly Issue #242 本期内容包括: Android中常用的设计模式; 基于No ...

  10. git命令行删除远程分支

    先查看远程分支 git branch -r 使用下面两条命令来删除远程分支 git branch -r -d origin/branch-name git push origin :branch-na ...