好久之前看的sg函数了

好像就记住一个nim博弈qwq

第一次啊看的时候很迷,现在感觉可以了qwq

首先我们来看一个其他的游戏。(以下游戏只有两个人参与,且足够聪明)

两个人在一张圆形的桌子上放等大的盘子,最后一个无法放盘子的人输掉比赛

很显然,先手必胜。

为什么? 第一个人可以将盘子放在桌子的中心。

然后只要第二个人可以放置盘子,我们就在其中心对称的位置上放盘子。

如此,只要后手可以放,我先手就一定能放

可以看出,有时候如果处于先手必胜的状态时,模仿对手的策略不妨是个好方法。这可以保证如果游戏可以进行下去的话,先手就一定能进行下去。

我们再来看一个更nim游戏的弱化版

有两个火柴堆,每堆的火柴数不一定相同,每次一个人只能从一堆中选取若干个火柴并取走。没有火柴可取的人输

好像这和上个题没有什么关系qwq

我们假设两个火柴堆的数目都相同。那么肯定是先手必输

为什么?因为后手总可以从另一堆中取的和先手上一次取得一样的火柴。

只要先手可以取,后手就可以取。

所有该游戏的判定条件是,若两堆相等,先手必输,否则,先手必胜,先手总可以将两堆取成一样多

先手必胜时总有一种策略可以转移到后手必败

后手必败总是会转移到先手必胜

好像大佬如此说过

然后我们看van♂整版nim

先说结论,若所有火柴堆异或起来的值为0的话,先手必败,否则先手必胜

啥?mengbi qwq

(?`⊿′)?为什么和异或结合起来的啊喂

这是得益于毒瘤的二进制和更毒瘤的异或

异或有一个特殊的规律,就是一堆数异或时,若在同一个二进制位上1的个数是偶数,那么这一位异或起来以后是0,否则为1

二进制的话就是可以使用0/1表示所有数字

我们来看上一个游戏,我们将这两堆的剩余的火柴数转变成二进制。

发现我们先手取走一个数,就是改变其二进制为上的1的个数(只考虑奇偶性),而后手再去取的话就是将其奇偶性再变回来

然后我们再回去看为什么异或和是0时先手必输,因为先手拿走了某些火柴时,我们可以根据其拿走火柴的二进制表示,在其他一堆中拿走一些一些数字,使得其异或和重新为0;

怎么搞呢? 我们可以拿走一些数,也就是减某一个数,使得先手拿完后,(啰嗦警告)

所有堆中的每个二进制上的一的个数的和,我们总可以通过加减一个数,达到在某一个二进制位的1的个数进行加一or减一的效果

使得某一位二进制上的1的个数变为偶数。

从而使得游戏又恢复到了一开始的局面

end......

sg函数好像也是这个思想qwq

此题代码

#include

#include

#include

#include

using std::sort;

const int maxn=501000;

int data[maxn];

int main()

{

int n;

scanf("%d",&n);

int x=0;

for(int i=1;i<=n;i++)

{

scanf("%d",&data[i]);

x^=data[i];

}

if(x==0)

{

printf("lose");

return 0;

}

for(int i=1;i<=n;i++)

if((data[i]^x)<=data[i])

{

printf("%d %d\n",data[i]-(data[i]^x),i);

data[i]^=x;

break;

}

for(int i=1;i<=n;i++)

printf("%d ",data[i]);

}

原文:https://www.cnblogs.com/Lance1ot/p/9409384.html

取火柴 c语言程序,取火柴游戏||Nim博弈相关推荐

  1. 火柴人小程序linux,火柴人你瞅啥小程序

    火柴人你瞅啥小程序是一款好玩的特色角色对战小游戏,游戏的画面精致好玩,享受快乐的冒险,火柴人你瞅啥小程序的每个画面精致冒险有趣,点击互动就可以完成你的角色互动,使游戏可以拥有更多的玩家,完成互动就可以 ...

  2. 火柴人小程序linux,火柴人手绘小程序

    火柴人手绘小程序是一款好玩的动作对战冒险小游戏,游戏中有各种帅气的火柴人等你来挑战,更加快乐的游戏冒险之旅就在火柴人手绘小程序中,完成闯关任务就可以获得大量的武器装备更新你的冒险之旅,完成各种艰难的挑 ...

  3. 计算机c语言运算符号取整,c语言取整(c语言四舍五入取整)

    C语言有以下几种取整方法:1. 直接赋值给整数变量.如:int i = 2.5: 或 i = (int) 2.5: 这种方法采用的是舍去小数部分2. 使用floor函数.floor(x)返回的是小于或 ...

  4. 火柴人小程序linux,火柴人战争帝国

    火柴人战争帝国小程序是一款精彩好玩的冒险对战小游戏,游戏中玩家们可以自由的进行冒险对战,火柴人战争帝国小程序中的角色玩法多样,更加多变的互动模式让玩家们可以在短时间制定大量的对战策略,指挥你的部队开始 ...

  5. c语言中除法怎么取模,c语言如何取模运算

    满意答案 hqshi888 2017.08.27 采纳率:45%    等级:13 已帮助:12014人 C语言用取模运算符"%"进行取模运算. 取模运算符"%" ...

  6. 人形图案c语言程序_做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码...

    经过之前的学习,我们基本掌握了开发小游戏所需要的语法知识和搭建方法,但是基础C语言的可视化与交互功能实在是太弱了 . 利用免费的EasyX插件,我们可以快速上手,简单实现很酷的视觉效果 . EasyX ...

  7. c语言程序游戏玩家管理系统,c语言程序课程设计--游戏玩家管理系统及C语言课程设计_简易计算器.doc...

    湖南涉外经济学院 课程设计报告 课程名称: C语言课程设计 报告题目: 游戏玩家管理系统 学生姓名: ** ** 所在学院: 信息科学与工程学院 专业班级: 电科 学生学号: **** ****** ...

  8. c语言x的2取模_c语言如何取模运算

    展开全部 取模运算符是% ,对负数32313133353236313431303231363533e4b893e5b19e31333366306438取模不一定都是正数. 例如: 例一:int mai ...

  9. 基础练习 回形取数 C语言 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。

    问题描述 回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度.一开始位于矩阵左上角,方向向下. 输入格式 输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列.接下来m ...

  10. c语言程序 出圈游戏,【出圈】 (C语言代码)

    解题思路:        简单易懂 建立一个数组,每次山区轮到的数字 后面的数字一次往前,最后打印出剩下的数字 注意事项:为了避免混乱  数组直接从1 开始 参考代码: #include int ma ...

最新文章

  1. 西游记里河水让人怀孕的秘密:是寄生虫!我往河里放了寄生虫!
  2. django 1.9 后台中文界面
  3. win7 64+python2.7.12安装numpy+scipy+matplotlib+scikit-learn
  4. STM8S103 PB4和PB5
  5. MKL学习——向量操作
  6. Java指定几个标点符号(或分割)分割字符
  7. MySQL 瓶颈分析及优化
  8. %lf 和 %f 有什么区别
  9. 小程序_小程序开发,小程序定制开发,小程序搭建,小程序系统开发
  10. 限制root远程登录
  11. CentOS7.9 EDA软件,Cadence、Synopsys、Mentor、Ansys、Keysight、Matlab、Vivado和Quartus等工具虚拟机平台
  12. 绿联网卡转接mac设置_绿联外置网卡Mac os 11.0 Big Sur驱动方案来了
  13. mbedtls库ssl/tls握手
  14. 【英雄联盟】关于我是如何打上超凡大师的,ADC键位设置
  15. 【技术贴】解决Eclipse编译java源文件之后没有生成class文件|找不到class文件
  16. 第三章:顺序结构程序设计(练习题)
  17. 09开博——不差钱,就缺朋友
  18. hnrxgs伸缩器在管道中的作用以及工作原理
  19. Flask蓝本与子域名
  20. ubuntu下文本标注工具BRAT全程离线安装

热门文章

  1. 进制转换之2进制与16进制之间的相互转换
  2. 前端智能化实践——可微编程
  3. 网站2008服务器32位好还是64位好,win server 2008 32位与64位区别
  4. 申论阅读:心中有爱,方能遇见更好的自己
  5. 异数OS 星星之火(一)-- 异数OS-织梦师云 用户使用手册
  6. 2016 博客导读总结 个人感悟
  7. linux 彻底删除oracle,Linux下完美卸载Oracle
  8. php生成海报像素低,TP5.1生成海报
  9. 【PIE-Engine Studio学习笔记06】图像分类——监督分类
  10. 计算机科学技术的广告语,十大经典深入人心科技类广告语