题目
明明和亮亮在玩一个游戏。桌面上一行有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;
}