poj 1704

一开始以为是动态规划呢,因为题号是从动态规划题目列表中找到的,但后来实在做不出来,也没做过NIM游戏,看了看一些大牛的解题资料,然后看了NIM游戏,才做了出来。

NIM游戏 百度百科讲的很详细:http://baike.baidu.com/view/1101962.htm

题目描述:http://poj.org/problem?id=1704

假设出现整个格子两两一对都互相挨着的情况(如果是奇数,则最左边的棋子在最左边的位置,即1位,假设和0位互相挨着),那么无论第一个人怎么移动,第二个人总能弄出两两一对都互相挨着的情况,那么谁先作出这种情况,那么他就胜利了。

而两两之间的格子恰巧可以看成NIM游戏。

一下是代码:

#include <stdio.h>
#include <stdlib.h>
int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main(int argc, char** argv) {

int n,i,j,k,yh,a[1000];

scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&k);
yh=0;
for(j=0;j<k;j++)
{
scanf("%d",&a[j]);
}
if(k%2==1)
{
a[k++]=0;
}
qsort(a,k,sizeof(int),comp);

for(j=0;j<k;j+=2)
{
yh^=a[j+1]-a[j]-1;
}
if(yh!=0)
{
printf("Georgia will win\n");
}
else
{
printf("Bob will win\n");
}

}

return (EXIT_SUCCESS);
}
posted @ 2012-03-10 12:04  枫月寒  阅读(187)  评论(0编辑  收藏  举报