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 }

 

 

posted @ 2012-04-20 19:34  wutaoKeen  阅读(286)  评论(0编辑  收藏  举报