posts - 99,  comments - 8,  trackbacks - 0

Nim游戏模型:
有三堆石子,分别含有x1,x2和x3颗石子。两人轮流取石子,每次可以选择一堆,从这堆里取走任意多颗石子,但不能不取。取走最后一颗石子的人获胜。
定理1:Nim游戏的一个状态(x1, x2, x3) 是P状态,当且仅当x1+x2+x3=0。
“Nim和”就是两个数二进制表示的不进位加法,就是两个整数转化成二进制之后进行异或^运算,相同取 0  不同取1 
定义:两个数(xm…x0)2和(ym…y0)2,是(zm…z0)2,其中zi=(xi+yi) mod 2,0<=i<=m。
例如,22和51的Nim和是37   即:10110  和 110011  进行^运算,得到  100101 
所以如果异或运算之后所有和都是 0 则为 p 状态

那么对应此题是不是就是:共有m个棋子就是有m堆石子,把每个位置的标号等价于该堆石子的数目,取走最后一颗石子的人获胜,就是最后一个回到 0 位置的人获胜,是不是就是nim 博弈问题呢?开始的时候我真的是一点头脑也摸不着,觉得好抽象啊!看了别人的解题报告之后才明白的。

#include <iostream>
#include 
<string>
using namespace std;

int main ()
{
    
int m;
    
int nim[1001];
    
int ki;
    
while ( scanf ("%d"&m) != EOF && m )
    
{
          int res = 0;
          for ( int i = 0; i < m; i ++ )
          
              scanf ( "%d", &ki );
              nim[ki] = ki;
              res ^= ki;                      //怎样对两个数进行位运算                  //进行位运算后相加和为 0 的话就是就是 p 状态 
          }  
          
          if ( res == 0 )        //先走的人面对的状态,所以走最后一步的人是后走的人,后走的人赢 
          printf ( "Grass Win!\n " );
          else
          printf ("Rabbit Win!\n");      
    }
    
// system ("pause");
     return 0;
}


posted on 2010-08-27 15:12 雪黛依梦 阅读(339) 评论(0)  编辑 收藏 引用 所属分类: 博弈

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜