C. Number Game(数字博弈)

考虑一下明显的必败态和必胜态

Ⅰ . 如 果 给 我 的 是 一 个 1 , 那 么 必 败 Ⅰ.如果给我的是一个1,那么必败 .1,

Ⅱ . 如 果 给 我 的 是 一 个 2 , 那 么 我 减 去 1 , 必 胜 Ⅱ.如果给我的是一个2,那么我减去1,必胜 .2,1,

Ⅲ . 如 果 给 我 的 是 一 个 没 有 奇 数 因 子 的 偶 数 , 必 败 Ⅲ.如果给我的是一个没有奇数因子的偶数,必败 .,

因 为 我 被 迫 减 去 1 , 得 到 一 个 奇 数 . 那 么 对 手 一 定 除 以 自 身 返 回 1 给 我 因为我被迫减去1,得到一个奇数.那么对手一定除以自身返回1给我 1,.1

如 此 一 来 , 想 赢 , 就 要 尽 可 能 构 造 情 况 Ⅲ \color{Red}如此一来,想赢,就要尽可能构造情况Ⅲ ,,

特判一下初始数是1和2的情况

一 . 初 始 数 是 奇 数 \color{Red}一.初始数是奇数 .

我 除 以 自 身 返 回 1 给 对 手 , 我 必 胜 我除以自身返回1给对手,我必胜 1,

一 . 初 始 数 是 偶 数 \color{Orange}一.初始数是偶数 .

能 不 能 构 造 情 况 Ⅲ 呢 ? 能不能构造情况Ⅲ呢? ?

这 么 想 吧 , 一 个 偶 数 可 以 拆 分 为 a 个 奇 数 因 子 和 b 个 偶 数 因 子 相 乘 这么想吧,一个偶数可以拆分为a个奇数因子和b个偶数因子相乘 ,ab

b 个 偶 数 相 乘 一 定 是 偶 数 , 那 么 这 a 个 奇 数 因 子 乘 在 一 起 也 一 定 是 奇 数 b个偶数相乘一定是偶数,那么这a个奇数因子乘在一起也一定是奇数 b,a

如 此 一 来 , 把 a 个 奇 数 因 子 记 作 x , 我 除 以 x , 得 到 的 是 一 个 没 有 奇 数 因 子 的 偶 数 如此一来,把a个奇数因子记作x,我除以x,得到的是一个没有奇数因子的偶数 ,ax,x,

对 手 拿 到 这 个 数 , 哎 呀 , 被 迫 减 1 , 那 我 们 得 到 不 为 1 的 奇 数 , 除 以 自 己 对手拿到这个数,哎呀,被迫减1,那我们得到不为1的奇数,除以自己 ,,1,1,

返 回 一 个 1 给 对 手 . 对 手 : 我 ∗ ∗ ∗ 返回一个1给对手.对手:我*** 1.:

赢 了 。 赢了。

补充

可 能 我 还 没 有 讲 清 楚 补 充 一 点 可能我还没有讲清楚补充一点

当 我 们 除 以 奇 数 因 子 后 得 到 的 是 一 个 偶 数 , 而 且 偶 数 不 能 为 2 当我们除以奇数因子后得到的是一个偶数,而且偶数不能为2 2

因 为 是 2 的 话 对 手 仍 然 是 被 迫 减 1 得 到 1 给 我 们 , 但 是 此 时 我 们 却 输 了 因为是2的话对手仍然是被迫减1得到1给我们,但是此时我们却输了 211,

所 以 特 判 一 下 除 以 后 是 否 是 2 [ 代 码 中 有 判 断 的 ] 所以特判一下除以后是否是2[代码中有判断的] 2[]

#include <bits/stdc++.h>
using namespace std;
int t,n;
int main()
{
	cin >> t;
	while(t--)
	{
		cin >> n;
		if(n==1)	cout<<"FastestFinger";
		else if(n==2)	cout<<"Ashishgup";
		else if(n%2==1)	cout<<"Ashishgup";
		else
		{
			int flag=0,z=sqrt(n);
			for(int i=2;i<=z;i++)//只要找到有奇数因子就行 
			{
				if(n%i!=0)	continue;
				if(i%2==1&&(n/i)!=2)	flag=1;
				if((n/i)%2==1&&i!=2)	flag=1;
			}
			if(flag)	cout<<"Ashishgup";
			else	cout<<"FastestFinger";
		}
		cout<<endl;
	}
}
以下是一个简单的博弈论示例,使用Matlab编写,其中包括两个玩家和一个3x3的博弈矩阵。每个玩家都可以选择行或列,并在矩阵中找到其对应的值。两个玩家交替进行,直到所有格子都被填满,然后计算每个玩家的得分,以决定胜者。代码如下: ``` % 定义博弈矩阵 game_matrix = [3 2 1; 1 2 3; 2 3 1]; % 定义玩家 player1 = 'Player 1'; player2 = 'Player 2'; % 初始化得分 score1 = 0; score2 = 0; % 游戏开始 for i = 1:9 % 玩家1选择行或列 disp(player1 + ", it's your turn."); choice = input('Enter "row" or "col": ', 's'); % 玩家1选择行或列的编号 num = input('Enter a number between 1 and 3: '); % 玩家1得到的分数 if strcmp(choice, 'row') score1 = score1 + game_matrix(num, :); elseif strcmp(choice, 'col') score1 = score1 + game_matrix(:, num); end % 打印当前得分 disp(player1 + "'s current score is " + score1); % 如果所有格子都被填满,则结束游戏 if sum(game_matrix(:) == 0) == 0 break; end % 玩家2选择行或列 disp(player2 + ", it's your turn."); choice = input('Enter "row" or "col": ', 's'); % 玩家2选择行或列的编号 num = input('Enter a number between 1 and 3: '); % 玩家2得到的分数 if strcmp(choice, 'row') score2 = score2 + game_matrix(num, :); elseif strcmp(choice, 'col') score2 = score2 + game_matrix(:, num); end % 打印当前得分 disp(player2 + "'s current score is " + score2); end % 游戏结束,计算得分 if score1 > score2 disp(player1 + " wins!"); elseif score2 > score1 disp(player2 + " wins!"); else disp("It's a tie!"); end ``` 请注意,这只是一个简单的示例,并且在实际应用中可能需要更复杂的博弈论策略和算法。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值