游戏 博弈

题目

明明和亮亮在玩一个游戏。桌面上一行有n个格子,一些格子中放着棋子。明明和亮亮轮流选择如下方式中的一种移动棋子(图示中o表示棋子,*表示空着的格子):

1) 当一枚棋子的右边是空格子的话,可以将这枚棋子像右移动一格。

**o***         ->           ***o**

2) 当一枚棋子的右边连续两个都有棋子,并且这个棋子往右边数第3格没有棋子,那么可以将这个棋子可以跳过去那两个棋子

**ooo*         ->           ***oo*

当任何一枚棋子到达最右边的格子时,这枚棋子自动消失。当一方不能移动时,这方输。假设明明和亮亮都采取最优策略,明明先走,谁将取胜?

思路

考虑用两种方式完成下列移动

**ooo***       ->           ***ooo**

显然第一种方式需要\(1\)步,第二种方式需要\(3\)步,多走\(2\)步,因为只有两个人,所以并不会影响游戏结果。所以可以把两种方式都看作第一种。

考虑维护所有棋子到最后一个格子的距离和。此距离和是偶数则后手获胜,否则先手获胜。

代码:

#include<bits/stdc++.h>
#define MaxL 1000
using namespace std;
int T,N;
char S[MaxL];
int main()
{
	cin>>T;
	while(T--)
	{
		int Ans=0;
		cin>>N>>S;
		for(int i=0;i<=N-1;i++)
			if(S[i]=='o')
				Ans+=(N-1-i);
		if(Ans%2==0)
			cout<<"L"<<endl;
		else cout<<"M"<<endl;			
	}
	return 0;
} 
posted @ 2019-07-11 20:21  TaylorSwift13  阅读(151)  评论(0编辑  收藏  举报