关于"尼姆"(Nim)的游戏
数学吧
全部回复
仅看楼主
level 2
云间鹰 楼主
我从一本书上看的:有 n (n>=3)堆火柴,两人轮流拿,每次只能在一堆中取,数目不限,谁拿到最后一根就输它的制胜策略及证明过程是什么?
2004年08月23日 07点08分 1
level 0
制胜策略问题,关键用两种思路:分类,逆向--zjmwqx
2004年08月23日 09点08分 2
level 2
云间鹰 楼主
那你知道答案了?
2004年08月23日 09点08分 3
level 0
你是逼着让我动笔拉,呵呵,我有时间的话看看.--zjmwqx
2004年08月23日 11点08分 4
level 1
我做过
2004年08月25日 15点08分 5
level 0
关键在于保持两堆数目相等当两堆都只剩下一根时 明显最后拿的人赢也就是能够在拿完火柴后使两堆数目相等的人赢 若开始两堆数目不等 -- 先拿的人赢 若开始两堆数目相等 -- 后拿的人赢p.s. 会不会一堆被拿光而另一堆剩下不只一根? 当然不会
2004年08月26日 02点08分 6
level 0
每堆用二进制表示,将n堆值加在一块,每位采用模二加,即1+1=0,1+0=1,0+1=1,0+0=0,若最后的得数为0,则后拿的人必胜,否则先拿的人必胜
2004年08月26日 03点08分 7
level 2
云间鹰 楼主
7楼的是正确答案,但我不知如何证明,请指教,谢谢
2004年08月26日 12点08分 8
level 0
玩这个游戏我从没输过
2004年08月27日 19点08分 9
level 0
没人先拿可以赢;1,2,3
2007年05月01日 07点05分 10
level 11
没人先拿可以赢:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
2007年05月01日 08点05分 11
level 0
我知倒
2007年06月09日 13点06分 12
level 0
先拿就输
2007年06月09日 13点06分 13
level 2
各堆xor,结果为0,先手必败,否则先手必胜
2007年07月14日 12点07分 14
level 0
我觉得先拿也能赢啊
2007年09月27日 02点09分 15
level 0
请算一下40,1967,1991谁先能赢?
2008年01月02日 01点01分 16
level 0
这是一个与Nim游戏类似的游戏,大家提点意见http://www.hudongxuexi.com/Game.jsp
2008年01月02日 02点01分 17
level 15
我晕倒!“f(c)”在贴子里竟然变成了“f(c)”……上面的代码改正过来重发一遍:
while(1){ a=u(1);b=u(2);c=u(3); while(a+b+c>0){ p=a;q=b;r=c; while(1){ d=prompt(a+","+b+","+c+"\r选择一堆(输入1,2或3)",f(3)+1); e=prompt("取走多少?",1); a-=d-1?0:e;b-=d-2?0:e;c-=d-3?0:e; if(confirm(a+","+b+","+c))break; else{ a=p;b=q;c=r; } } if(a<0||b<0||c<0||a+b+c<1||d<1||d>3||e<1){ b=0;break; } for(i=a+b+c;i;i--) if(k(a-i,b,c)||k(a,b-i,c)||k(a,b,c-i))break; if(!i) if(a>b&&a>c)a=f(a); else if(b>c)b=f(b); else c=f(c); if(a+b+c<1)b=-1; } if(!confirm((b<0?"您赢":"您输")+"了,再来一局?"))break; } function f(x){ return Math.ceil(Math.random()*x)-1; } function u(x){ return prompt("输入第"+x+"堆火柴数",f(9)+1); } function k(x,y,z){ if(x<0||y<0||z<0||(x^y^z)&&(x>1||y>1||z>1)||(x+y+z)%2<1&&x<2&&y<2&&z<2)return 0; a=x;b=y;c=z; return 1; } 
2008年01月04日 14点01分 19
level 0
确实很牛,佩服。
2008年01月10日 05点01分 21
level 0
学编程难吗?你是学计算机的吗?还是学数学的?
2008年01月10日 08点01分 22
1 2 尾页