尼姆博弈:
描述:有n堆石子,每堆若干个,两个人轮流从某一堆取任意多石子,规定每次至少取1个,多者不限,最后取光者得胜
结论:对n个石子数进行异或运算,结果为0则为P点,先手必败,否则为N点
题目:POJ 2234
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110;
int main()
{
int n;
while(~ scanf("%d", &n))
{
int ans = 0, a;
for(int i = 1; i <= n; i++) scanf("%d", &a), ans ^= a;
if(ans == 0) printf("No\n");
else printf("Yes\n");
}
return 0;
}
巴什博弈:
描述:一堆石子有n个,两人轮流取石子,每次取
1至m
个,最后无石子可取的人输
结论:
n%(m+1)=0
是
P
点,先手必败,否则为N点
题目:HDU 1846
#include <bits/stdc++.h>
using namespace std;
const int N = 1000 + 10, INF = 0x3f3f3f3f;
int main()
{
int t, n, m;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
if(n % (m + 1) == 0) puts("second");
else puts("first");
}
return 0;
}
威佐夫博弈:
描述:两堆石子,数量任意,两人轮流取石子,有两种取法:一种是从某一堆取走任意数量的石子,另一种是从两堆中取走相同数量的石子,最后无石子可取者输。问先手输赢
结论:对于两堆石子
题目:POJ 1067
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1010;
int main()
{
int a, b;
while(~ scanf("%d%d", &a, &b))
{
if(a > b) swap(a, b);
int k = b - a;
int c = (int)(k*(sqrt(5) + 1) / 2.0);
if(a == c) printf("0\n");
else printf("1\n");
}
return 0;
}