讲到博弈,不得不讲异或运算, 我真服了 大神了, 怎么会将博弈和二进制联系到一起,  大写的服!

异或运算 ^    原理就是  二进制形式,对于相应的每一位  相同 为0 不同为1 ;

简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。

a^(b^c)=(a^b)^c  这是结合律;

a^a=0;  0^x=x;  1^x=!x=1-x;

异或 可以实现两个 值的 交换而又不 借用第三者,  这在大量数据是 非常有效

    int x=3,y=4;x=x^y;y=x^y;x=x^y;printf("%d  %d \n",x,y);

说回到博弈,  一般规定,谁最后拿 即为胜利, 有时也规定谁最后拿输掉,

这个 时候 异或就非常有效,  我们这样来考虑,   将 物品分为N 堆, 每一堆都有至少一个物品,而要求一般是,最少拿一个,不能不拿, 上不封顶,  这就有一个先手与后手的问题,  先手怎样做才能保证一直赢,或者后手怎样做才能不输, 这就有策略的味道,网上的代码 有好多, 看了半天 晕啊晕,

首先 讲到一个 奇异局势(a^b^c=0),

这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)。这是网上威佐夫博弈(类似于尼姆博弈)的解释 看明白了么?

不明白的话,  这样解释一下,  奇异局势 就是 上一个人拿完后 轮到你时,当前你要面对的 局势,   而在尼姆博弈中无论谁面对奇异局势都是必败,, 我们可知,  (0,0,0)是奇异局势, ,(0.n,n)也是,此时 无论你怎样做都是无用功,例如(0,3,3) (如果你想去个3或者2(其实都一样), 对方只要在另一堆中去到只剩下1  那么接下来,你必须首先得先干掉1,此时仍有棋子在上面,对方全部取走,你就必输)

由此可知:

1. 无论谁面对奇异局势 则必输,

2. 奇异局势,取若干个,变成非奇异, 非奇异也能取若干个到奇异局势,

3.奇异局势 结果 a^b^c^...=0  结果必为0

如何 从非奇异到奇异  a^b^c=0,  把c 变成 a^b  这是可以的 因为a^a =0 ;

然后 c-a^b 就是取走的个数

说了这么多,  没有代码怎么行;

/*
谁取最后一个 先胜, A 先手
*/
#include<stdio.h>int main()
{int x,n,m,i,sum;scanf("%d",&n);sum=0;for(i=0;i<n;i++){scanf("%d",&x);sum^=x;}if(sum)printf("A胜\n");elseprintf("B胜\n"); //b 面对奇异局势   return 0;
}

来看几道题

hdu 1850Being a Good Boy in Spring Festival

Problem Description
一年在外 父母时刻牵挂
春节回家 你能做几天好孩子吗
寒假里尝试做做下面的事情吧

陪妈妈逛一次菜场
悄悄给爸爸买个小礼物
主动地 强烈地 要求洗一次碗
某一天早起 给爸妈用心地做回早餐

如果愿意 你还可以和爸妈说
咱们玩个小游戏吧 ACM课上学的呢~

下面是一个二人小游戏:桌子上有M堆扑克牌;每堆牌的数量分别为Ni(i=1…M);两人轮流进行;每走一步可以任意选择一堆并取走其中的任意张牌;桌子上的扑克全部取光,则游戏结束;最后一次取牌的人为胜者。
现在我们不想研究到底先手为胜还是为负,我只想问大家:
——“先手的人如果想赢,第一步有几种选择呢?”

Input
输入数据包含多个测试用例,每个测试用例占2行,首先一行包含一个整数M(1<M<=100),表示扑克牌的堆数,紧接着一行包含M个整数Ni(1<=Ni<=1000000,i=1…M),分别表示M堆扑克的数量。M为0则表示输入数据的结束。
Output
如果先手的人能赢,请输出他第一步可行的方案数,否则请输出0,每个实例的输出占一行。
Sample Input
3 5 7 9 0
Sample Output
1
输出可行方案数
#include<stdio.h>
#include<string.h>
#include<iostream>using namespace std;int a[500];
int main()
{int n;while(cin>>n&&n){memset(a,0,sizeof(a));int sum=0,res=0;for(int i=0;i<n;i++){cin>>a[i];sum^=a[i];}for(int i=0;i<n;i++){if(a[i]>(sum^a[i]))//就是说c 可以用a^b 来替换的话 前提要比a^b 大 {res++;}}cout<<res<<endl;}return 0;
}

hdu 1907  John

Problem Description
Little John is playing very funny game with his younger brother. There is one big box filled with M&Ms of different colors. At first John has to eat several M&Ms of the same color. Then his opponent has to make a turn. And so on. Please note that each player has to eat at least one M&M during his turn. If John (or his brother) will eat the last M&M from the box he will be considered as a looser and he will have to buy a new candy box.

Both of players are using optimal game strategy. John starts first always. You will be given information about M&Ms and your task is to determine a winner of such a beautiful game.

Input
The first line of input will contain a single integer T – the number of test cases. Next T pairs of lines will describe tests in a following format. The first line of each test will contain an integer N – the amount of different M&M colors in a box. Next line will contain N integers Ai, separated by spaces – amount of M&Ms of i-th color.

Constraints:
1 <= T <= 474,
1 <= N <= 47,
1 <= Ai <= 4747

Output
Output T lines each of them containing information about game winner. Print “John” if John will win the game or “Brother” in other case.
Sample Input
2 3 3 5 1 1 1
#include <iostream>
#include <cstring>
#include <stdio.h>using namespace std;int main()
{int t,n,m,res;int a[5000];cin>>t;while(t--){cin>>n;m=res=0;memset(a,0,sizeof(a));for(int i=0;i<n;i++){cin>>a[i];m^=a[i];if(m>1)res++;}if((m&&res)||(m==0&&res==0))//john 先手, 当他m 不等于0 (非奇异局势) 并且 res的个数大于0 胜利printf("John\n");//或者 0 并且res=0;elseprintf("Brother\n");}return 0;
}

hdu 2509Be the Winner

Problem Description
Let's consider m apples divided into n groups. Each group contains no more than 100 apples, arranged in a line. You can take any number of consecutive apples at one time.
For example "@@@" can be turned into "@@" or "@" or "@ @"(two piles). two people get apples one after another and the one who takes the last is 
the loser. Fra wants to know in which situations he can win by playing strategies (that is, no matter what action the rival takes, fra will win).
Input
You will be given several cases. Each test case begins with a single number n (1 <= n <= 100), followed by a line with n numbers, the number of apples in each pile. There is a blank line between cases.
Output
If a winning strategies can be found, print a single line with "Yes", otherwise print "No".
Sample Input
2 2 2 1 3
Sample Output
No Yes

123

#include <iostream>
#include <cstring>
#include <algorithm>
#include <stdio.h>using namespace std;int a[500];
int main()
{int n,res,m,sum;int  full;while(cin>>n){res=sum=0;full=0;for(int i=0;i<n;i++){cin>>a[i];sum^=a[i];if(a[i]>1)full=1;}if(full)// 非孤单堆{if(sum)printf("Yes\n");elseprintf("No\n");}else//孤单堆   需考虑{if(!sum){printf("Yes\n");}else{if((n&1))printf("No\n");elseprintf("Yes\n");}}}return 0;
}

转载于:https://www.cnblogs.com/sizaif/p/9078569.html

尼姆博奕 (Nimm Game) 异或运算;相关推荐

  1. c语言 Nimm game算法,尼姆博奕(Nimm Game)

    尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜. 这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某 ...

  2. 三大数学博弈:巴什博奕 威佐夫博奕 尼姆博奕

    有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等均可.两个 人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间很古老的一个游戏 ,别看这游戏极其简单,却蕴含着深刻的数学原理 ...

  3. 博弈的三个巨人 巴什博奕 威佐夫博奕 尼姆博奕

    转载一篇有关博弈写得不错的文章,同时也对文章中的错误部分修正. 博客正容:[一](先来苦涩的理论) (一)巴什博奕(Bash Game):只有一堆n 个物品,两个人轮流从这堆物品中取物, 规定每次至少 ...

  4. 基础博弈论(巴什博奕、斐波那契博弈、威佐夫博奕、尼姆博奕)

    [前言] 今天才算是搞明白了(??)最基本的四种博弈 [小结] 1.巴什博奕(Bash Game) 一堆中取石子,两个人轮流取石子,每次取石子量至少为1,至多为m,先取完者胜利. 当n%(m+1)== ...

  5. HDU多校10 - 6886 Tic-Tac-Toe-Nim(尼姆博奕)

    题目链接:点击查看 题目大意:两个人在玩游戏,给出一个 3 * 3 的棋盘,每个格子上有数个石子,两人轮流取石子,谁先取完某一列或某一行的最后一个石子就算胜利,一般情况是,每个人可以取任意一堆中任意数 ...

  6. 关于博弈基础知识的总结:巴什博弈(Bash Game)、威佐夫博奕(Wythoff Game)、尼姆博奕(Nim Game)

    转载自http://www.aiuxian.com/article/p-942548.html 博弈论是二人或多人在平等的对局中各自利用对方的策略变换自己的对抗策略,达到取胜目标的理论. 基础的基础 ...

  7. 阶梯博弈(尼姆博奕进阶)

    n个阶梯(编号1~n),每个阶梯上有ni个石子,从第 i+1 个阶梯可以拿若干个石子到第 i 个阶梯上,第 1 个阶梯可以拿到地面(可以看作第 0 个阶梯,或者你也可以叫它基层),无法执行操作(石子全 ...

  8. 三种经典博弈(巴什博弈,威佐夫博奕,尼姆博奕)

    前言: 有一种很有意思的游戏,就是有物体若干堆,可以是火柴棍或是围棋子等等 均可.两个人轮流从堆中取物体若干,规定最后取光物体者取胜.这是我国民间 很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的 ...

  9. 巴什博奕,威佐夫博奕,尼姆博奕,斐波那契博弈模板

    1.巴什博奕 只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜. 显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够 ...

最新文章

  1. OSGi将Maven与Equinox结合使用
  2. ZZULIOJ 1105: 判断友好数对(函数专题)
  3. frame越过另一个frame_一个价值2万美元的Facebook DOM XSS漏洞
  4. feignclient对象找不到_领导同事争相介绍对象,相亲N次,我找不到一条结婚的理由...
  5. OpenStack单点部署及使用简单教程(附:部署好的VMware虚拟机)
  6. linux开机启动服务,Linux开机启动服务
  7. Android基于mAppWidget实现手绘地图(九)–如何处理地图对象的touch事件
  8. 尚硅谷Javaweb教程书城项目订单模块完整版
  9. 企业微信的好处和功能介绍 | 最新企业微信电脑版下载
  10. OSChina 周日乱弹 —— 你今天又穿女装上班了
  11. oracle12c启动ODM,Oracle 12c impdp 导入ORA-17500: ODM err:Communication error on send 错误处理方法...
  12. 一个商品SKU是怎么生成的 1
  13. ssh导出数据库的数据到Excel表格
  14. 2022 中小企业快成长之年,上云 选对平台是关键,这次我站华为云
  15. HTTP请求状态码集合
  16. QueryDSL 关于Q类找不到的问题
  17. 使用myeclispe或者sts工具,创建的myBatis的 xml文件不提示的问题解决方法
  18. Android开发未来的出路何在
  19. size和sizeof的区别
  20. 720P、1080P、4K之间有什么区别和联系?

热门文章

  1. php 解析 js new date,js new Date() 测试
  2. mysql gbk支持_让MYSQL支持GBK
  3. php的$_FILES如何生成以及如何与上传文件对象产生联系
  4. 【深度学习】U-Net 网络分割多分类医学图像解析
  5. Android移动开发之【通往安卓的神奇之旅】Android的五大布局和AndroidManifest
  6. 【网页前端设计Front end】CSS入门(看不懂你来打我)
  7. 中山网络推广浅谈网站提高用户体验要做好的5点!
  8. 移动端网站优化也不容小觑!
  9. 网站降权可从两方面着手分析
  10. 网站优化上首页不算成功稳定排名才算