hdu 1849 Rabbit and Grass

Nim博弈

題意:有m堆牌,兩個人先後取某堆中的任意(不少於一)張牌,最後取完者勝;問先手取勝第一次取牌有多少種取法。

思路:1)如若給出 的是必敗狀態:a1^a2^......^an=0,則先手不會有任何可能獲得勝利;

           2)若給出的是必勝狀態:a1^a2^.......^an=k,(其中k不爲零),那麼我們的目的是要把必勝狀態

        轉化爲必敗狀態從 而使得先手勝利。若a1^a2^...^an!=0,一定存在某個合法的移動,將ai

       改變成ai'後滿足a1^a2^...^ai'^...^an=0。若a1^a2^...^an=k,則一定存在某個ai,

       它的二進制 表示在k的最高位上是1(否則k的最高位那個1是怎麼得到的)。這時ai^k<ai一定

       成立。則我們可以將ai改變成ai'=ai^k,此時a1^a2^...^ai'^...^an=a1^a2^...^an^k=0。

總結:誰先面臨奇異狀態誰輸,就是說誰先拿到非奇異狀態誰走最後一步棋,誰勝!


代碼如下:

#include<stdio.h>
int main()
{
  int m,a[1010];
  int sum,i;
  while(~scanf("%d",&m),m)
  {
     sum=0;
     for(i=1;i<=m;i++)
       {
         scanf("%d",&a[i]);
         sum=sum^a[i];
       }   
      if(sum==0)
        printf("Grass Win!\n");
       else
        printf("Rabbit Win!\n");                   
  }    
  return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章