这题首先可以这样想,如果每行的两颗棋子都挨着的话,那么先手就必输,这个好想.那么我们就可以让它变成所有的都挨着,能的话,就能赢,否则就必输[前提是两个人都是按照对自己最有利的形式移动].那么这样就变成了n堆得石子问题了,这里n是行数.这样就简单很多了,只需要算出每行的棋子间距,然后所有的间距异或一下,如果是0的话就是P-position否则是N-position,其中P-position的话先手必输N-position的话先手必赢.至于为什么先手必输或必赢.以前写过一点,等过段时间转到这个博客来.也可以自己参考相应书籍.下面是这题的代码:

/
ID:klion26
TASK:HDU_1730
LANG:C
*/

#include
#include
#include
#include

int main(void)
{
freopen(“hdu-1730.in”,“r”,stdin);
freopen(“hdu-1730.out”,“w”,stdout);
int n,m
int a,b,i,t,k
while(EOF != scanf(“%d%d”,n,&m))
{
t=0
for(i=0i<n;i++)
{
scanf(“%d%d”,a,&b);
k=a>b?a-b-1:b-a-1;//算间距
t ^= k//异或算结果
}
if(0!=t)//N-position
printf(“I WIN!\n);
else//P-position
printf(“BAD LUCK!\n);
}
return 0
}

Comments

2011-03-15