poj2133(sg函数)
关于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函数)的更多相关文章
- 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)运算 ...
- POJ2425 A Chess Game[博弈论 SG函数]
A Chess Game Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 3917 Accepted: 1596 Desc ...
- bzoj1188 [HNOI2007]分裂游戏 博弈论 sg函数的应用
1188: [HNOI2007]分裂游戏 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 973 Solved: 599[Submit][Status ...
- BZOJ1188 [HNOI2007]分裂游戏(SG函数)
传送门 拿到这道题就知道是典型的博弈论,但是却不知道怎么设计它的SG函数.看了解析一类组合游戏这篇论文之后才知道这道题应该怎么做. 这道题需要奇特的模型转换.即把每一个石子当做一堆石子,且原来在第i堆 ...
- sg函数与博弈论2
参考链接: http://blog.sina.com.cn/s/blog_51cea4040100h3l9.html 这篇主要就是讲anti-sg.multi-sg和every-sg的. 例1 poj ...
- sg函数与博弈论
这个标题是不是看起来很厉害呢... 我们首先来看一个最简单的游戏.比如我现在有一堆石子,有p个,每次可以取走若干个(不能不取),不能取的人就输了. 现在假设有两个人要玩这个游戏,一个人先手,一个人后手 ...
- hdu1536&&hdu3023 SG函数模板及其运用
S-Nim Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status ...
随机推荐
- VS2005 调试不能设置断点的解决办法
[ 1] 以前也遇到过同样的问题,但没有问个为什么,也没有探个毕竟.昨天调试一个DLL,添加输出信息吧,太麻烦而且不轻易定位, 但设置断点后按“F5”,断点不可用,气泡提示“当前不会命中断点,还没有为 ...
- 在Windows平台用visual studio编译的可执行文件部署时报:应用程序无法正常启动0xc000007b(跟DirectX9无关的原因)
最近在做EasyDarwin开源流媒体服务器Windows版本编译与部署时发现一个问题,在开发机本机运行都很正常,但是部署到目标机器(未安装vs等开发环境)时,莫名其妙报出了"应用程序无法正 ...
- EasyPlayer实现视频播放局部缩放、广角平移功能(类似水滴直播,快手视频)
本文转自:http://blog.csdn.net/jyt0551/article/details/56063869 视频播放局部缩放.广角平移功能 在预览图片的时候,利用手势控制图片的缩放.平移,已 ...
- 简单监控网站访问是否正常的shell脚本,邮件报警。网站恢复后继续运行。
#!/bin/bash # 使用curl检查网页是否可以正常访问,如果无法访问则发邮件. SITE=crm.bjzgjh.com PROT=80 URL="http://$SITE:$PRO ...
- C++ Lambda表达式和仿函数笔记
C++11中引入了Lambda表达式,其语法如下: [capture list](parameter list)->return type { function body } 参考博文:C++ ...
- iTerm2常用的快捷键
iTerm2 是 Mac 上面一款优秀的终端软件,配合 Oh My Zsh 一起使用,整个终端的体验会变得异常流畅和舒服.iTerm2 的颜值也是非常的高的,完全可以说秒杀 Mac 自带的终端软件.既 ...
- php高级技巧总结
通过对<深入理解PHP:高级技巧.面向对象与核心技术>这本书的学习,总结出常用的php高级技巧,也方便自己以后查阅;我认为该书是php高级教程的葵花宝典,哈哈.里面的内容很实用,尤其是在项 ...
- [coci2012]覆盖字符串 AC自动机
给出一个长度为N的小写字母串,现在Mirko有M个若干长度为Li字符串.现在Mirko要用这M个字符串去覆盖给出的那个字符串的.覆盖时,必须保证:1.Mirko的字符串不能拆开,旋转:2.Mirko的 ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
- 通过kettle数据导入mysql时,空值的处理在插入mysql时,会自动转转换为null值,无法插入
1.windows下C:\Users\用户名\.kettle目录中找到kettle.properties文件,增加KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y2.Li ...