hdu2177 取(2堆)石子游戏----威佐夫博弈,输出第一步最优策略
#include<iostream>#include<cstdlib>#include<stdio.h>#include<math.h>using namespace std;const double q=(1+sqrt(5.0))/2.0;void solve(int a,int b){ if(a>b) swap(a,b); int k=b-a; int c=(int)(k*q); if(a==c) puts("0"); else { puts("1"); if(a==0) puts("0 0"); if(a>=c&&b>=c) printf("%d %d\n",c,c+k); for(int i=1;i<=b;i++) { if(a==(int)(i*q)&&b>=a+i&&i!=k) printf("%d %d\n",a,a+i); if(b==(int)(i*q)+i&&a>=b-i&&i!=k) printf("%d %d\n",b-i,b); else if(a==(int)(i*q)+i&&b>=a&&i!=k) printf("%d %d\n",a-i,a); } }}int main(){ int a,b; while(scanf("%d%d",&a,&b)!=EOF) { if(a==0&&b==0) break; solve(a,b); }}