问题描述
猫山大王和刘大姐在玩一个游戏。桌面上一行有n个格子,一些格子中放着棋子。猫山大王和刘大姐轮流选择如下方式中的一种移动棋子(图示中o表示棋子,*表示空着的格子):
1)当一枚棋子的右边是空格子的话,可以将这枚棋子像右移动一格。
**o*** -> ***o**
2)当一枚棋子的右边连续两个都有棋子,并且这个棋子往右边数第3格没有棋子,那么可以将这个棋子往右跳过那两个棋子
**ooo* -> ***oo*
当任何一枚棋子到达最右边的格子时,这枚棋子自动消失。当一方不能移动时,这方输。假设猫山大王和刘大姐都采取最优策略,猫山大王先走,谁将取胜?
输入格式
第一行一个整数T表示数据组数, 0 < T < 10。
之后T组数据,每组两行,
第一行n 表示格子个数,
第二行n个字符表示每个格子的情况,o表示有棋子,*表示空着。
输出格式
对于每组数据一个输出,M表示猫山大王赢,L表示刘大姐赢。
样例输入
4
2
*o
5
*o***
6
**o**o
14
*o***ooo**oo**
样例输出
L
M
M
L
提示
对于50%的数据, n <20。
对于100%的数据, n < 1000。
首先我们可以想到记忆化搜索,搜索所有的可能的情况,然而n=999的规模我们可以发现这么做并不可行
因此我们应该想一想更简单的方法
首先我们草稿纸演算可以发现,不论是第一种走法还是第二种走法,所有棋子到最右边的位置的距离和的奇偶性是必然会发生一次变化的。
第一次轮到猫山大王时,s是奇数,那么每次轮到猫山大王时s都是奇数。而当s是奇数时,s肯定>0,这时猫山大王总可以走最右边的棋子。也就是说当s为奇数时,总有棋子可以走。所以说,一开始若s为奇数,则猫山大王必胜。同理,若一开始s为偶数,则当刘大姐走的时候s总是奇数,所以猫山大王必败。
#include<iostream>
#include<cstdio>
using namespace std;
int t,n;
char c[1005];
int main(){
cin>>t;
while(t--){
scanf("%d%s",&n,c+1);
int i,sum=1;
for(i=1;i<=n;i++)
if(c[i]=='o')
sum+=n-i;
if(sum&1)puts("L");
else puts("M");
}
}