标签:des style blog color io os ar java for
1 2 5 8 4 7 2 2 0 0
0 1 4 7 3 5 0 1 0 0 1 2/*本题还是威佐夫博弈。 利用重要性质:任何自然数都包含在一个且仅有一个奇异局势中。 奇异局势即必败点,想要理解威佐夫博弈,在百度文库博弈入门有详细解释 */ /*核心思路:以m[k],n[k]为界限来分析,就是3种情况 (1)如果a>m[k],b>n[k],自然的剩下的石子数量就是a[k],b[k]; (2)如果a<m[k](b<n[k]),然后你就需要在m[k]之前寻找是不是有m[i]或者b[i]和a相等, 是不是有m[i]或者n[i]和b相等,当然了有的情况是不需要考虑的因为是不可能出现的。 (3),如果a=m[k],那么你就挂了。 */ #include<stdio.h> #include<math.h> int a[1000010]; int b[1000010]; int main() { int m,n,t,k,i; a[0]=0,b[0]=0; a[1]=2,b[1]=1; for(i=2;i<1000010;i++) //先打表。 { b[i]=i*(1+sqrt(5))/2; a[i]=b[i]+i; } while(scanf("%d %d",&m,&n)!=EOF&&(m+n)) { if(m<n); { t=m;m=n;n=t; } k=m-n; if(n==b[k]) { printf("0\n"); continue; } else //核心思路的代码。 { printf("1\n"); if(n<b[k]) { for(i=1;i<n;i++){ if(n==b[i]&&m>a[i]) printf("%d %d\n",b[i],a[i]); if(m==a[i]&&n>b[i]) printf("%d %d\n",b[i],a[i]); } } if(n>b[k]) { printf("%d %d\n",b[k],a[k]); for(i=1;i<n;i++) { if(n==a[i]&&m>b[i]) printf("%d %d\n",b[i],a[i]); if(n==b[i]&&m>a[i]) printf("%d %d\n",b[i],a[i]); } } } } return 0; }
标签:des style blog color io os ar java for
原文地址:http://blog.csdn.net/hdd871532887/article/details/40475161