ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数学: 博弈论. Nim游戏

2022-07-22 22:04:44  阅读:177  来源: 互联网

标签:... 石子 游戏 Nim ai 博弈论 a1 必负态 a2


C++

AcWing 891. Nim游戏

/*
题目描述:
	891. Nim游戏:
	给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
	问如果两人都采用最优策略,先手是否必胜。

	输入格式:
	第一行包含整数 n。
	第二行包含 n 个数字,其中第 i 个数字表示第 i 堆石子的数量。

	输出格式:
	如果先手方必胜,则输出 Yes。
	否则,输出 No。

	数据范围:
	1 ≤ n ≤ 10^5,
	1 ≤ 每堆石子数 ≤ 10^9

解题思路:
	对于这种 Nim 游戏,首先需要考虑的是 必负态,
	如果能让对手到达 必负态 的就是必胜态,否则就是必负态,加入必负态集合中。

	从题目可知, n 堆石子全为 0 的状态就是必负态,本题不方便进行推导,我先给出公式后证明。
	设 n 堆石子数量为 a1, a2, ..., an,倘若 a1 ^ a2 ^ ... ^ an = 0,表示先手必负,否则先手必胜。(其中 ^ 表示二进制异或)
	
	证明:
		1. 当 n 堆石子 全为 0,是必负态,满足 a1 ^ a2 ^ ... ^ an = 0 的条件。
		2. 当 a1 ^ a2 ^ ... ^ an = x,并且 x != 0 时,我们来证明其是必胜态:
			a1 ^ a2 ^ ... ^ an = x 等式左侧,必定存在 ai,满足 x 的二进制最高位 1 在 ai 中也为 1。
			那么可得  (ai ^ x) < ai。因此 a1 ^ a2 ^ ... ^ an = x 等式两侧同时异或上 x,可得
			a1 ^ a2 ^ ... ^ an ^ x = 0
			a1 ^ a2 ^ ... ^ (ai ^ x) ^ ... ^ an = 0
			因此,我们在第 i 堆中可以拿出 ai - (ai ^ x)个石子,来使得剩余堆石子异或为 0
		3. a1 ^ a2 ^ ... ^ an = 0条件下,我们拿出任意个石子,都不可能保持 异或 等于 0 的条件
			假如说我们从第i堆取出一些石子(大于 0 ),数量从 ai 变为 bi ,我们假设异或仍旧等于 0
			a1 ^ a2 ^ ... ^ ai ^ ... ^ an = 0 
			a1 ^ a2 ^ ... ^ bi ^ ... ^ an = 0
			我们两式合并 (a1 ^ a2 ^ ... ^ ai ^ ... ^ an) ^ (a1 ^ a2 ^ ... ^ bi ^ ... ^ an) = 0
			化简之后可得 ai ^ bi = 0,因此可以得到 ai = bi,然而 bi 是严格小于 ai 的,所以说假设不成立。
		综上可知 a1 ^ ... ^ an = 0 为必负态,其余是必胜态。这是因为必胜态可以让对手达到必负态,必负态只能让对手达到必胜态
 */
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 100010;
int a[N], n;


bool solution() {
	int res = 0;
	for (int i = 1; i <= n; i ++ ) {
		res = (res ^ a[i]);
	}

	if (res == 0) {
		return false;
	} else {
		return true;
	}
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++ ) {
		scanf("%d", &a[i]);
	}

	if (solution()) {
		puts("Yes");
	} else {
		puts("No");
	}

	return 0;
}


标签:...,石子,游戏,Nim,ai,博弈论,a1,必负态,a2
来源: https://www.cnblogs.com/lucky-light/p/16508068.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有