NKOI 3539 移棋子游戏[6月月赛题A]

                                                                        移棋子游戏
问题描述

猫山大王和刘大姐在玩一个游戏。桌面上一行有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");
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值