//必输态:(1,2)、(3,5)、(4,7)、(6,10)、(8,13)、(9,15)、(11,18)、(12,20)......
//(x,y)中y-x的值是递增1的,而且x和y是不重复的自然数
#include <iostream>
#include<stdlib.h>
#include<cstring>
using namespace std;
#define LEN 1000000
unsigned int *s;
bool exist[LEN];
int delta=0;
int Next(int x)
{
x++;
while(1)
{
if(exist[x]) x++;
else return x;
}
}
void oper(int del)
{
int i,j;
j=s[delta];
for(i=delta+1;i<=del;i++)
{
j=Next(j);//j=1,3,4,6,10...
exist[j]=true;
exist[j+i]=true;
s[i]=j;//s[0]=0,s[1]=1,s[2]=3,s[3]=4,s[4]=6...
}//两个人每走一步都把必输态丢给对方
}
int main()
{
unsigned int x,y;
int del;
memset(exist,0,LEN);
exist[0]=true;
s=(unsigned int *)malloc(sizeof(unsigned int)*LEN);
memset(s,0,sizeof(unsigned int)*LEN);
while(cin>>x && cin>>y)
{
del=abs(x-y);//三角形的Delta,表示差值
if(del==0)
cout<<1<<endl;
oper(del);
delta=del;//避免下一次输入重复计算,节约时间
if((s[del]==x && s[del]+del==y) ||(s[del]==y && s[del]+del==x))
cout<<0<<endl;
else//判断如果不是必输态,则把必输态丢给对方
cout<<1<<endl;
}
return 0;
}
取石子游戏
最新推荐文章于 2021-07-13 15:56:22 发布