HDU 1730 Northcott Game

只是一道取石子游戏的变形题,刚开始我想着去打表,一直打不出后来画图就一下子清楚了;

我们来分析只有一行的情况:

我们知道只要黑白棋子之间有空格,只要谁先走就一定谁赢,因为先走者一定会走到与两个棋子之间没有空格的地方,这样才能保证他赢,我们看成取石子且石子只有一堆的情况;

那么多行时,我们就可以把两个棋子之间的空格看成有多少个石子,而行可以看成有多少堆,再利用Nim就可以解决问题了;

View Code
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstdlib>

 4 #include<algorithm>

 5 #include<cmath>

 6 #include<queue>

 7 #include<set>

 8 #include<map>

 9 #include<vector>

10 using namespace std;

11 

12 int main(  )

13 {

14     int n , m,a,b;

15     while( scanf( "%d %d",&n,&m )==2 )

16     {

17        int t = 0 ;

18        for( int i = 0 ; i < n ; i ++ ) 

19        {

20            scanf( "%d %d",&a,&b );

21            if( a < b )

22            {

23                a ^= b;

24                b ^= a;

25                a ^= b;    

26            }     

27            t ^= ( a - b - 1 );

28        }  

29        if( t ) puts( "I WIN!" );

30        else puts( "BAD LUCK!" );    

31     }

32     //system( "pause" );

33     return 0;

34 }

 

 

你可能感兴趣的:(game)