B. Sequential Nim(先后手,博弈)

考 虑 明 显 的 必 胜 态 \color{Red}考虑明显的必胜态

Ⅰ . 当 我 先 手 且 面 前 只 有 一 堆 石 子 , 全 部 拿 掉 , 我 必 胜 Ⅰ.当我先手且面前只有一堆石子,全部拿掉,我必胜 .,,

Ⅱ . 当 有 两 堆 石 子 , 且 第 一 堆 石 子 只 有 1 个 , 那 我 只 能 全 拿 走 Ⅱ.当有两堆石子,且第一堆石子只有1个,那我只能全拿走 .,1,

剩 下 一 堆 被 对 手 全 部 拿 走 , 我 必 败 剩下一堆被对手全部拿走,我必败 ,

Ⅲ . 当 有 两 堆 石 子 , 且 第 一 堆 大 于 1 个 , 那 么 我 拿 得 只 剩 一 个 , 对 手 再 拿 完 这 堆 Ⅲ.当有两堆石子,且第一堆大于1个,那么我拿得只剩一个,对手再拿完这堆 .,1,,

然 后 我 再 拿 完 第 二 堆 , 我 必 胜 . . . . . . . . . . . . . 然后我再拿完第二堆,我必胜............. ,.............

根据上面的基本分析可以知道石子的数目只有两类

石子数目等于1,或者大于1,多大是没有影响的

这 么 想 , 一 开 始 我 是 先 手 , 要 必 胜 , 就 要 保 证 在 拿 第 n 堆 石 子 后 是 后 手 这么想,一开始我是先手,要必胜,就要保证在拿第n堆石子后是后手 ,,,n

我 们 直 接 去 维 护 拿 完 每 堆 石 子 后 的 先 后 手 情 况 我们直接去维护\color{Red}拿完每堆石子后的先后手情况

Ⅰ . 当 出 现 a i = 1 时 , 先 手 的 人 只 能 拿 完 , 所 以 拿 完 这 堆 之 后 Ⅰ.当出现a_i=1时,先手的人只能拿完,所以拿完这堆之后 .ai=1,,

先 手 变 后 手 , 后 手 变 先 手 先手变后手,后手变先手 ,

Ⅱ . 当 出 现 a i > 1 时 , 先 手 的 人 可 以 全 部 拿 走 , 此 时 先 手 变 后 手 Ⅱ.当出现a_i>1时,先手的人可以全部拿走,此时先手变后手 .ai>1,,

先 手 也 可 以 只 拿 a i − 1 个 石 子 , 那 么 另 一 个 人 只 能 拿 完 这 堆 先手也可以只拿a_i-1个石子,那么另一个人只能拿完这堆 ai1,

所 以 拿 完 后 , 先 手 还 是 先 手 所以拿完后,先手还是先手 ,

发 现 了 什 么 ? 当 a i > 1 时 , 先 手 的 人 可 以 让 自 己 保 持 先 手 \color{Red}发现了什么?当a_i>1时,先手的人可以让自己保持先手 ?ai>1,

也 可 以 选 择 变 成 后 手 , 这 其 实 已 经 包 含 了 获 胜 的 所 有 可 能 \color{Red}也可以选择变成后手,这其实已经包含了获胜的所有可能 ,

所以碰到 a [ i ] a[i] a[i]>1时,此时先手的人必胜

碰到 a [ i ] = = 1 a[i]==1 a[i]==1时,改变先后手情况

#include <bits/stdc++.h>
using namespace std;
int t,n,a[100009];
int main()
{
	cin >> t;
	while( t-- )
	{
		cin >> n;
		int xian=1,hou=0;//代表目前可以是先手 
		for(int i=1;i<=n;i++)	cin >> a[i];
		for(int i=1;i<=n;i++)
		{
			if( a[i]==1 )
			{
				if(xian)	hou=1,xian=0;
				else if(hou)	xian=1,hou=0;
			}
			else
			{
				if( xian )	xian=hou=1;//那我赢了呀!!先后后手任我选 
				else	xian=hou=0;//那我输了呀,因为对手是先手,可以左右游戏了
				break; 
			}
		}
		if( hou )	cout<<"First"<<endl;
		else cout<<"Second"<<endl;
	}
}

总 的 来 说 这 种 简 单 的 博 弈 问 题 总的来说这种简单的博弈问题

Ⅰ . 分 析 显 然 的 必 胜 态 , 慢 慢 推 出 去 Ⅰ.分析显然的必胜态,慢慢推出去 .,

Ⅱ . 思 考 如 何 构 造 出 上 面 最 显 然 的 必 胜 态 Ⅱ.思考如何构造出上面最显然的必胜态 .

emmm讲完啦,希望对你有帮助,一起进步呀!

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值