HDU 1730 Northcott Game
只是一道取石子游戏的变形题,刚开始我想着去打表,一直打不出后来画图就一下子清楚了;
我们来分析只有一行的情况:
我们知道只要黑白棋子之间有空格,只要谁先走就一定谁赢,因为先走者一定会走到与两个棋子之间没有空格的地方,这样才能保证他赢,我们看成取石子且石子只有一堆的情况;
那么多行时,我们就可以把两个棋子之间的空格看成有多少个石子,而行可以看成有多少堆,再利用Nim就可以解决问题了;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }