HDU 3404&POJ 3533 Nim积(二维&三维)
(Nim积相关资料来自论文曹钦翔《从“k倍动态减法游戏”出发探究一类组合游戏问题》)
关于Nim积计算的两个函数流程:

代码实现如下:
int m[2][2]={0,0,0,1};
int Nim_Multi_Power(int x,int y)
{
if(x<2)
return m[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,s=y/m,t=y%m;
int d1=Nim_Multi_Power(p,s);
int d2=Nim_Multi_Power(p,t);
return (m*(d1^d2))^Nim_Multi_Power(m/2,d1);
}
int Nim_Multi(int x,int y)
{
if(x<y)
return Nim_Multi(y,x);
if(x<2)
return m[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,q=x%m,s=y/m,t=y%m;
int c1=Nim_Multi(p,s);
int c2=Nim_Multi(p,t)^Nim_Multi(q,s);
int c3=Nim_Multi(q,t);
return (m*(c1^c2))^c3^Nim_Multi_Power(m/2,c1);
}
以下是两道用Nim积来实现的博弈题:
(1)HDU 3404 Switch lights:http://acm.hdu.edu.cn/showproblem.php?pid=3404
#include<iostream>
#include<cstdio>
using namespace std; int m[2][2]={0,0,0,1};
int Nim_Multi_Power(int x,int y)
{
if(x<2)
return m[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,s=y/m,t=y%m;
int d1=Nim_Multi_Power(p,s);
int d2=Nim_Multi_Power(p,t);
return (m*(d1^d2))^Nim_Multi_Power(m/2,d1);
} int Nim_Multi(int x,int y)
{
if(x<y)
return Nim_Multi(y,x);
if(x<2)
return m[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,q=x%m,s=y/m,t=y%m;
int c1=Nim_Multi(p,s);
int c2=Nim_Multi(p,t)^Nim_Multi(q,s);
int c3=Nim_Multi(q,t);
return (m*(c1^c2))^c3^Nim_Multi_Power(m/2,c1);
} int main()
{
int t,n,x,y;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int res=0;
while(n--)
{
scanf("%d%d",&x,&y);
res^=Nim_Multi(x,y);
}
if(res)
printf("Have a try, lxhgww.\n");
else printf("Don't waste your time.\n");
}
return 0;
}(2)POJ 3533 Light Switching Game:http://poj.org/problem?id=3533
上一题是二维Nim积,这道题与之不同的是求三维Nim积,但本质相同。
#include<iostream>
#include<cstdio>
using namespace std; int m[2][2]={0,0,0,1};
int Nim_Multi_Power(int x,int y)
{
if(x<2)
return m[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,s=y/m,t=y%m;
int d1=Nim_Multi_Power(p,s);
int d2=Nim_Multi_Power(p,t);
return (m*(d1^d2))^Nim_Multi_Power(m/2,d1);
} int Nim_Multi(int x,int y)
{
if(x<y)
return Nim_Multi(y,x);
if(x<2)
return m[x][y];
int a=0;
for(;;a++)
if(x>=(1<<(1<<a))&&x<(1<<(1<<(a+1))))
break;
int m=1<<(1<<a);
int p=x/m,q=x%m,s=y/m,t=y%m;
int c1=Nim_Multi(p,s);
int c2=Nim_Multi(p,t)^Nim_Multi(q,s);
int c3=Nim_Multi(q,t);
return (m*(c1^c2))^c3^Nim_Multi_Power(m/2,c1);
} int Nim_Multi2(int x,int y,int z)
{
int t=Nim_Multi(x,y);
return Nim_Multi(t,z);
} int main()
{
int n,x,y,z;
while(~scanf("%d",&n))
{
int res=0;
while(n--)
{
scanf("%d%d%d",&x,&y,&z);
res^=Nim_Multi2(x,y,z);
}
if(res)
printf("No\n");
else printf("Yes\n");
}
return 0;
}
HDU 3404&POJ 3533 Nim积(二维&三维)的更多相关文章
- 使用C语言实现二维,三维绘图算法(1)-透视投影
使用C语言实现二维,三维绘图算法(1)-透视投影 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想 ...
- 使用C语言实现二维,三维绘图算法(3)-简单的二维分形
使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...
- 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
使用C语言实现二维,三维绘图算法(2)-解析曲面的显示 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...
- ARCGIS二维三维导航
在使用代码前需要先安装arcgis10.0 或者10.1都可以 不过本人建议初学者安装10.0比较容易安装.. 安装方式和二维三维地图的加载网上都有,就不在此一一赘述了. 先从基本的功能开 ...
- HDU 5465 Clarke and puzzle Nim游戏+二维树状数组
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 26 ...
- POJ 3533 Light Switching Game(三维Nim积)题解
思路:三维Nim积 代码: #include<set> #include<map> #include<stack> #include<cmath> #i ...
- poj 2155:Matrix(二维线段树,矩阵取反,好题)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17880 Accepted: 6709 Descripti ...
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- poj 1195 Mobile phones(二维树状数组)
树状数组支持两种操作: Add(x, d)操作: 让a[x]增加d. Query(L,R): 计算 a[L]+a[L+1]……a[R]. 当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一 ...
随机推荐
- NoSQL数据建模技术
原文来自“NoSQL Data Modeling Techniques”,由酷壳网陈皓编译<NoSQL数据建模技术>.这篇文章看完之后,你可能会对NoSQL的数据结构会有些感觉.我的感觉是 ...
- python json数组对象排序
arr = [{"name": "name_1", "level": 1}, {"name": "name_2 ...
- WindowsServer2012 R2 64位中文标准版(IIS8.5)下手动搭建PHP环境详细图文教程(二)安装IIS8.5
//来源:http://www.imaoye.com/Technology/WindowsServer2012R264IIS85.html 阿里云服务器ECS Windows Server 2012 ...
- AutoCAD 2009及以上 32位&64位 官方原版下载地址
AutoCAD 2017 AutoCAD 2017 简体中文版 32位 http://trial2.autodesk.com/NET17SWDLD/2017/ACD/DLM/AutoCAD_2017_ ...
- 如何查看centos系统版本
[root@LAMP1 config]# cat /proc/version Linux version 2.6.32-279.el6.x86_64 (mockbuild@c6b9.bsys.dev. ...
- Redis 的几种数据结构&五种数据类型对象
先看几种数据结构 通过分析底层的数据结构,学习如何根据场景选型和设计 1,简单动态字符串 redis使用的字符串SDS有别于C语言中的字符串 a, 结构 free字段为已分配但未使用的空间 len为已 ...
- python 主机宝
需求:开发一个主机批量管理系统,要求按saltstack方式执行命令 #!/usr/bin/env python3. # -*- coding:utf8 -*- import os,sys,pickl ...
- unity3d和php后台简单交互--一
unity3d开发时,用PHP作为后台是个不错的选择.对一些数据吞吐量不是很大的游戏,比如某个游戏的排名,登录等等,一般的php程序能够胜任了,并且php语言简单,开发容易对数据库尤其是mysql的支 ...
- 关于在vs中添加生成命令时的注意事项
涉及到目录最好用双引号括起来,防止在目录含有空格或文字时发生错误.例如 del "$(SolutionDir)\..\xxxxxx\xxxx\Build\*.*" /s /q xc ...
- SQL 小笔记
如何得到字段的类型 select sql_variant_property(ID,'BaseType') from tb