博弈论-威佐夫博弈

1.威佐夫博弈的条件(1)人数为两人(2)物品为两堆,每一个人在取物品的时候要么在一堆中取若干物品,要么在两堆中取相等的物品。每次至少一个,可以取完这一堆。(3)先手必败的条件:在奇异局势下必败。

2.OK,如果你不是很懂什么叫做奇异局势,那么听我解释。我们知道物品两为两堆,每一堆的数量数a,b。我们记作(a,b).假设在这个状态下,先手是必败的,那么这个状态就叫做奇异局势。比如(1,2).(3,5)等等。奇异局势有着很重要的应用,也有着很优美的性质。

3.奇异局势的性质:

(1).任何自然数都包含在一个且仅有一个的奇异局势中。

证明:若(a[k],b[k])为一个奇异局势,因为b[k]=a[k]+k,a[k]>a[k-1]  =》  b[k] >a[k-1]+k >a[k-1]+k-1 =》 b[k-1] > a[k-1].

(2)任何操作都会将奇异局势变成非奇异局势

由性质1可知,即使是同时减少,两个数的差值不变,所以不可能成为其他奇异局势的差,因此也是非奇异局势;

(3)可采用适当的方法将非奇异局势变为奇异局势,那么下一个必输;

3.如何判断一个局势是否是奇异局势呢?对于任意一个局势(a,b).假设a<=b,c=b-a,这里引入一个参数:1.618.没错,看上去很熟悉,黄金分割。很多人在写博客的时候写道这里的时候都会惊叹数学之美,原来一切练习的如此紧密,数学在生活中的每一个角落。如果a=c*1.618.那么这就是一个奇异的局势,否则不是。那么下面就很简单了。给出一个裸题。

威佐夫博弈。下面时AC的代码:

#include
#include
#pragma warning(disable:4996)
using namespace std;
int main()
{

	int n, m;
	while (~scanf("%d%d", &n, &m))
	{
		int a = min(m, n);
		int b = max(m, n);
		int c = b - a;
		double r = (sqrt(5.0) + 1) / 2;
		int tem = (int)(r*c);
		if (a ==tem)
		{
			cout << 0 << endl;
		}
		else
		{
			cout << 1 << endl;
		}
	}
	return 0;
}

 

你可能感兴趣的:(博弈论)