突然发现博弈好有意思啊,很神奇的感觉
给大家推荐大佬的博客,讲的很详细:
威佐夫博弈传送门
自己实现了一下这道题,很简单
HDU1527
重点是这个1.618即(sqrt(5)+1)/2
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
long long m, n;
while(scanf("%lld%lld",&n,&m)!=EOF)
{
int temp;
if(n > m)
{
temp = n;
n = m;
m = temp;
}
double w = (sqrt(5) + 1) / 2;
int book = (m - n) * w;
if(book == n)printf("0\n");
else printf("1\n");
}
return 0;
}
这道题有点麻烦,也是威佐夫博弈,就是得输出赢的情况,直接暴力有可能重复输出
所以我用了map存已经出现过的情况,省去了很多去重的麻烦,直接暴力AC
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
int main()
{
int m, n;
while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
{
map<int,int>mapp;//去重
double w = (sqrt(5) + 1.0) / 2.0;
if((int)(w * (m - n)) == n)printf("0\n");
else
{
printf("1\n");
//int a, b;
int m1 = m;
for(int i = n - 1; i >= 0; i --)
{
m1 --;
if((int)(w * (m1 - i)) == i)
printf("%d %d\n",i,m1);
}
//int temp;
for(int i = m - 1; i >= 0; i --)
{
if((int)(w * abs(n - i)) == min(n, i) && mapp[min(n,i)] == 0)
{
printf("%d %d\n",min(n,i),max(n,i));
mapp[min(n,i)] = max(n, i);
}
}
for(int i = n - 1; i >= 0; i --)
{
if((int)(w * abs(m - i)) == i && mapp[i] == 0)
{
printf("%d %d\n",i , m);
mapp[i] = m;
}
}
}
}
return 0;
}