HDU 取(2堆)石子游戏 2177 威佐夫博弈+尼姆博弈

#include <iostream>   取2堆
#include <cmath>
using namespace std;
//取任意一堆的时候,为什么不对量少的那一堆取呢,因为(k2-k1)*t == k1 k1减小,这个等式永远成立不了
int main()
{
    double t=(sqrt(5)+1)/2.0;
	int m,n,k,i,k1,k2,temp;
	while (cin>>m>>n,m+n)
	{
		k=n-m;
		if ((int)(k*t)==m)
		{
			cout<<"0"<<endl;
		}
		else
		{
			cout<<"1"<<endl;
			for (i=1;i<=n;i++)
			{
                k1=m-i;
				k2=n-i;
				if((int)((k2-k1)*t) == k1)
					cout<<k1<<" "<<k2<<endl;
			}
			for (i=n;i>0;i--)
			{
                int a=m;
				int b=i;
				if(a>b)
				{
                    temp=a;
					a=b;
					b=temp;
				}
				if((int)((b-a)*t) == a)
                    cout<<a<<" "<<b<<endl;
			}
		}
	}
	return 0;
}
#include <iostream>     //取m堆
#include <cmath>
using namespace std;

int main()
{
    int n,a[2000],i,m,j;
    while (cin>>n,n)
    {
	    for(i=0,m=0;i<n;i++)
		{
			cin>>a[i];   
			m^=a[i];
		}	
		  if (m==0)
		  {
			   cout<<"No"<<endl;
		  }
		  else
		  {
			  cout<<"Yes"<<endl;
			  for (i=0;i<n;i++)
			  {
				  j=m^a[i];
				   if (a[i]>j)
				   {
					   cout<<a[i]<<" "<<j<<endl;
				   }
			   }
			  
		   }
		
    }
	return 0;
}

#include <iostream>     //HDU 1849
#include <cmath>
using namespace std;

int main()
{
    int n,a[1000],i,m,j;
    while (cin>>n,n)
    {
	    for(i=0,m=0;i<n;i++)
		{
			cin>>a[i];   
			m^=a[i];
		}	
		  if (m!=0)
		  {
			   cout<<"Rabbit Win!"<<endl;
		  }
		  else
		  {
			  cout<<"Grass Win!"<<endl;
// 			  for (i=0;i<n;i++)
// 			  {
// 				  j=m^a[i];
// 				   if (a[i]>j)
// 				   {
// 					   cout<<a[i]<<" "<<j<<endl;
// 				   }
// 			   }
			  
		   }
		
    }
	return 0;
}


你可能感兴趣的:(HDU 取(2堆)石子游戏 2177 威佐夫博弈+尼姆博弈)