威佐夫博弈奇异态(必败态)的条件是a[k]=[k*(sqrt(5.0)+1.0)/2.0]。暴力找出必败态即可。
代码如下:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <math.h> 4 #include <vector> 5 #include <map> 6 #include <set> 7 using namespace std; 8 typedef pair<int,int> pii; 9 const int N = 1000000 + 5; 10 11 int main() 12 { 13 int a,b; 14 while(scanf("%d%d",&a,&b)==2) 15 { 16 if(a==0 && b==0) break; 17 18 if(a>b) swap(a,b); 19 int k = b-a; 20 int a_k = (sqrt(5.0)+1.0)/2.0*k; 21 if(a_k == a) 22 { 23 printf("0\n"); 24 continue; 25 } 26 else 27 { 28 printf("1\n"); 29 if(a_k<a)printf("%d %d\n",a_k,a_k+k); 30 double x = (sqrt(5.0)+1.0)/2.0; 31 set<pii> S; 32 for(int i=b-1;i>=0;i--) 33 { 34 int n = a; 35 int m = i; 36 if(n > m) swap(n,m); 37 int k = m - n; 38 if(n == (int)(k * x)) 39 { 40 printf("%d %d\n",n,m); 41 S.insert(pii(n,m)); 42 break; 43 } 44 } 45 for(int i=a-1;i>=0;i--) 46 { 47 int n = i; 48 int m = b; 49 int k = m - n; 50 if(n == (int)(k * x) && S.find(pii(n,m))==S.end()) 51 { 52 printf("%d %d\n",n,m); 53 break; 54 } 55 } 56 } 57 } 58 }
时间: 2024-10-10 06:57:14