poj1067-取石子游戏-wythoff博弈

打表找规律失败,搜了一下原来是wythoff博弈

 1 /*--------------------------------------------------------------------------------------*/
 2
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <cstring>
 6 #include <ctype.h>
 7 #include <cstdlib>
 8 #include <cstdio>
 9 #include <vector>
10 #include <string>
11 #include <queue>
12 #include <stack>
13 #include <cmath>
14 #include <set>
15 #include <map>
16
17 //debug function for a N*M array
18 #define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)19 {for(int j=0;j<(M);j++){20 printf("%d",G[i][j]);}printf("\n");}
21 //debug function for int,float,double,etc.
22 #define debug_var(X) cout<<#X"="<<X<<endl;
23 #define LL long long
24 const int INF = 0x3f3f3f3f;
25 const LL LLINF = 0x3f3f3f3f3f3f3f3f;
26 const double eps = 1e-8;
27 /*--------------------------------------------------------------------------------------*/
28 using namespace std;
29
30 int N,M,T;
31 int mem[1000][1000] = {0};
32 const double q = (1+sqrt(5.0)) / 2.0;
33
34 void display(int x)
35 {
36     if(x==0) return ;
37     display(x>>1);
38     putchar((x&1) + ‘0‘);
39 }
40
41 int sg(int a,int b)
42 {
43     if(mem[a][b] != -1) return mem[a][b];
44     if(a == 0 && b == 0)return 0;
45     set<int> st ;
46     for(int i=1;i<=a;i++)
47     {
48         st.insert(sg(a-i,b));
49     }
50     for(int i=1;i<=b;i++)
51     {
52         st.insert(sg(a,b-i));
53     }
54     for(int i=1;i<=min(a,b);i++)
55     {
56         st.insert(sg(a-i,b-i));
57     }
58     int g = 0;
59     while(st.find(g) != st.end()) g++;
60     return mem[a][b] = g;
61 }
62
63 int Wythoff(int a,int b)
64 {
65     if( a > b) swap(a,b);
66     int k = b - a;
67     if(a == (int)(k*q)) return 0;
68     else return 1;
69 }
70
71 int main()
72 {
73     int a,b;
74     while(~scanf("%d%d",&a,&b))
75     {
76         printf("%d\n",Wythoff(a,b));
77     }
78 }
时间: 2024-10-03 14:05:16

poj1067-取石子游戏-wythoff博弈的相关文章

hdu1527 &amp; poj1067 取石子游戏 威佐夫博奕模型,,模板题o(╯□╰)o

取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35727   Accepted: 12065 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者

hdu 2516 取石子游戏 Fibonacci博弈 入门题

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3069    Accepted Submission(s): 1784 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win&q

hdu 2516 取石子游戏 (Fibonacci博弈)

取石子游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8159    Accepted Submission(s): 4950 Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win&qu

POJ1067 取石子游戏 威佐夫博弈 博弈论

http://poj.org/problem?id=1067 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者. Input 输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000

POJ1067 取石子游戏

Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者. Input 输入包含若干行,表示若干种石子的初始情况,其中每一行包含两个非负整数a和b,表示两堆石子的数目,a和b都不大于1,000,000,000. Output 输出对应也有

[Wythoff博弈] poj 1067 取石子游戏

题目链接: http://poj.org/problem?id=1067 取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33556   Accepted: 11180 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石

取石子游戏(hdu2516+FIB博弈)

G - 取石子游戏 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2516 Description 1堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍.取完者胜.先取者负输出"Second win".先取者胜输出"First win".

poj 1067||hdu 1527 取石子游戏(博弈论,Wythoff Game)

取石子游戏 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37893   Accepted: 12684 Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后把石子全部取完者为胜者.现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者

HDU 1527 取石子游戏 威佐夫博弈

题目来源:HDU 1527 取石子游戏 题意:中文 思路:威佐夫博弈 必败态为 (a,b ) ai + i = bi     ai = i*(1+sqrt(5.0)+1)/2   这题就求出i然后带人i和i+1判断是否成立 以下转自网上某总结 有公式ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,-,n 方括号表示取整函数) 其中出现了黄金分割数(1+√5)/2 = 1.618-,因此,由ak,bk组成的矩形近似为黄金矩形 由于2/(1+√5)=(√5-1)/2,可以先