#include "iostream"
#include "vector"
#include "string.h"
#include "set"
using namespace std;
int grundy[10000];
int a[100];
int x[1000000];
int n, k;
int max()
{
int m = x[0];
for(int i=1; i<n; i++)
if(m < x[i])
m = x[i];
return m;
}
int main()
{
cout << "硬币堆数 n = ";
cin >> n;
cout << "可取硬币数组大小 k = ";
cin >> k;
cout << "可取硬币数组:";
int i, j;
for(i=0; i<k; i++)
cin >> a[i];
cout << "每堆硬币个数:" ;
for(i=0; i<n; i++)
cin >> x[i];
int max_x = max();
for(i=0; i<=max_x; i++) //求i对应grundy值
{
set<int> s;
for(j=0; j<k; j++)
if(a[j] <= i)
s.insert(grundy[i-a[j]]);
int g = 0;
while(s.count(g)) //寻找不包含于s的最小非负整数
g++;
grundy[i] = g;
}
int result = 0;
for(i=0; i<n; i++)
result ^= grundy[x[i]];
if(result)
cout << "Alice" << endl;
else
cout << "Bob" << endl;
return 0;
}
Grundy数---博弈
最新推荐文章于 2020-06-21 15:53:41 发布