level 2
我从一本书上看的:有 n (n>=3)堆火柴,两人轮流拿,每次只能在一堆中取,数目不限,谁拿到最后一根就输它的制胜策略及证明过程是什么?
2004年08月23日 07点08分
1
level 0
制胜策略问题,关键用两种思路:分类,逆向--zjmwqx
2004年08月23日 09点08分
2
level 0
你是逼着让我动笔拉,呵呵,我有时间的话看看.--zjmwqx
2004年08月23日 11点08分
4
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 11
没人先拿可以赢:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
2007年05月01日 08点05分
11
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