标签:acm 威佐夫博弈 取2堆石子游戏 hdu2177 hdu1527进阶
1 2 5 8 4 7 2 2 0 0
0 1 4 7 3 5 0 1 0 0 1 2
1.a==b
同时减去a 得到0,0
2.a==a_k b>b_k
b -(b-b_k)
3.a==a_k b<b_k
同时拿走a_k-a_(b-a_k)
得到 a_(b-a_k) a_(b-a_k) + b-a_k
4.a>a_k b==b_k
从a中拿走 a-a_k
5.a<a_k b==b_k
5.1 a==a_ j (j<k)
b-(b-b_ j)
得到 a_ j b_ j
5.2 a==b_ j (j<k)
b-(b-a_ j)
得到 b_ j a_ j
反正我是没搞懂!!o(╯□╰)o。。。。
我的方法就是 穷举了:
第一个分支,从两堆物品中同时取出相同数量的物品
第二个分支,只从一堆物品中取物品
(从多的那一堆中取,为什么只从多的那一堆中取捏?
Because 从少的那一堆中取 与 从多的那一堆中取中会有一部分重合的地方,
重合的就是从少的那一堆取的情况。)
不知道,这样讲各位是否能懂了。
资质愚笨,只能领悟到这里了。。。
/************************************** *************************************** * Author:Tree * *From :http://blog.csdn.net/lttree * * Title : 取(两堆)石子游戏 * *Source: hdu 2177 * * Hint : 威佐夫博弈 * *************************************** **************************************/ #include <stdio.h> #include <math.h> int main() { int a,b,i,k,m,n; double eqa = (1+sqrt(5.0))/2.0; while( scanf("%d%d",&a,&b)!=EOF && (a||b) ) { // 当a>b时,交换a,b的值,当然你也可以用一个中间变量来交换a,b值 if( a > b ) { a^=b; b^=a; a^=b; } k=b-a; if( int(k*eqa)==a ) printf("0\n"); else { printf("1\n"); for(i=1; i<=a; ++i) { n=a-i,m=b-i; if( int(k*eqa) == n ) printf("%d %d\n",n,m); } for(i=b; i>=0; --i) { n=a,m=i; if( n > m ) { n^=m; m^=n; n^=m; } k=m-n; if( int(k*eqa) == n ) printf("%d %d\n",n,m); } } } return 0; }
ACM-威佐夫博弈之取(2堆)石子游戏——hdu2177,布布扣,bubuko.com
标签:acm 威佐夫博弈 取2堆石子游戏 hdu2177 hdu1527进阶
原文地址:http://blog.csdn.net/lttree/article/details/24872295