取石子遊戲之尼姆博弈

2021-06-07 22:46:15 字數 2352 閱讀 8957

尼姆博弈:有三堆各若干個物品,兩個人輪流從某一堆取任意多的物品,規定每次至少取乙個,多者不限,最後取光者得勝

。這種情況與二進位制有著很大的關係,我們用(a,b,c)來表示某種局勢,那麼(0,0,0)必然為奇異局勢,最後乙個面對這個局勢的必敗。(0,n,n)也是種奇異局勢。因為如果對手在其中一堆取m個石子(m<=n),那麼你也可以在另外一堆中取m個,他取幾個你就取幾個,到最後有一堆變為0的時候,你再取完另一堆勝利。

直接說結論吧:

對於任意的奇異局勢(a,b,c),都有a^b^c=0。(^為異或運算)。

對於任意的非奇異局勢(a,b,c),假設a原理:因為a^a=0,所以a^b^c=a^b^(a^b)=(a^a)^(b^b)=0,所以只需將c-(a^b)即可。

例1:有個非奇異局勢(14,21,39),因為14^21=27,39-27=12,所以從39中拿走12個物體即可達到奇異局勢(14,21,27)。

例2:我們來實際進行一盤比賽看看:

甲:(7,8,9)->(1,8,9)奇異局勢

乙:(1,8,9)->(1,8,4)

甲:(1,8,4)->(1,5,4)奇異局勢

乙:(1,5,4)->(1,4,4)

甲:(1,4,4)->(0,4,4)奇異局勢

乙:(0,4,4)->(0,4,2)

甲:(0.4,2)->(0,2,2)奇異局勢

乙:(0,2,2)->(0,2,1)

甲:(0,2,1)->(0,1,1)奇異局勢

乙:(0,1,1)->(0,1,0)

甲:(0,1,0)->(0,0,0)奇異局勢

甲勝。性質1:對於某個局面(a1,a2,...,an),若a1^a2^...^an!=0,一定存在某個合法的移動,將ai改變成ai'後滿足a1^a2^...^ai'^...^an=0。

分析:令res=a1^a2^......an,設res的最高位為pos(那pos的數肯定為1啦),那麼一定存在某個ai,它的二進位制在pos位上也是1,(否則k的最高位那個1是怎麼得到的)。異或res後這位變為0,這時ai^res則我們可以將ai改變成ai'=ai^res,此時a1^a2^...^ai'^...^an=a1^a2^...^an^res=0。

性質2:對於某個局面(a1,a2,...,an),若a1^a2^...^an=0,一定不存在某個合法的移動,將ai改變成ai'後仍滿足a1^a2^...^ai'^...^an=0。

例題1:poj 2975,題目意思是給你一組局勢,問有多少中必勝的策略。

分析:求出res=a[0]^a[1]^a[2].....a[n-1],由於每次只能改變一堆石子的數量,由性質1,可知如果res!=0,那麼一定存在某個合法的操作,使得res=0,只要滿足a[i]*res<=a[i]。

#includeusing namespace std;

const int max=1010;

int a[max];

int main()

=3,mex{}=0。

對於乙個給定的有向無環圖,我們定義關於圖的每個頂點的sg函式g如下:g(x)=mex。

sg函式的性質:由於是乙個有向無環圖,那麼對於所有的末端位置,由於沒有後繼,所以sg=0。另外對於乙個g(x)=0的頂點x,它的所有後繼y都滿足g(y)!=0(由於集合中的元素是不可以重複的,所以後面的g(y)!=0)。對於乙個g(x)!=0的頂點,必定存在乙個後繼y滿足g(y)=0(這個時候最小的非負整數一定是0)。

由上可知:頂點x所代表的位置是必敗點條件是:g(x)=0。

看到乙個經典的話額,就貼在這裡吧:

有些事,明知是錯的,也要去堅持,因為不甘心;有些人,明知是愛的,也要去放棄,因為沒結局;有時候,明知沒路了,卻還在前行,因為習慣了。

poj 2488~八嘎

#include

#include

#include

using namespace std;

const int max=10;

#define clr(arr,val) memset(arr,val,sizeof(arr))

int visit[max][max];

int n,m,dx[8]=,dy[8]=;

struct point ;

point start;

vectorv;

bool inside(point p)

void dfs(point p)

}} 

int main()

{   int case,num=1;

cin>>case;

while(case--)

{   cin>>n>>m;

clr(visit,0);

cout<<"scenario #"<::size_type i=0;i

取 m堆 石子遊戲(尼姆博弈)

description m堆石子,兩人輪流取.只能在1堆中取.取完者勝.先取者負輸出no.先取者勝輸出yes,然後輸出怎樣取子.例如5堆 5,7,8,9,10先取者勝,先取者第1次取時可以從有8個的那一堆取走7個剩下1個,也可以從有9個的中那一堆取走9個剩下0個,也可以從有10個的中那一堆取走7個剩...

取 m堆 石子遊戲(尼姆博弈)

description m堆石子,兩人輪流取.只能在1堆中取.取完者勝.先取者負輸出no.先取者勝輸出yes,然後輸出怎樣取子.例如5堆 5,7,8,9,10先取者勝,先取者第1次取時可以從有8個的那一堆取走7個剩下1個,也可以從有9個的中那一堆取走9個剩下0個,也可以從有10個的中那一堆取走7個剩...

取石子系列 四 取石子(六)(尼姆博弈)

取石子 六 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 最近topcoder的piaoyi和hrdv很無聊,於是就想了乙個遊戲,遊戲是這樣的 有n堆石子,兩個人輪流從其中某一堆中任意取走一定的石子,最後不能取的為輸家,注意 每次只能從一堆取任意個,可以取完這堆,但不能不取...