小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说:
“我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了”。
K大师在纸上画了一行n个格子,要小明和他交替往其中填入字母。
并且:
1. 轮到某人填的时候,只能在某个空格中填入L或O
2. 谁先让字母组成了“LOL”的字样,谁获胜。
3. 如果所有格子都填满了,仍无法组成LOL,则平局。
小明试验了几次都输了,他很惭愧,希望你能用计算机帮他解开这个谜。
输入格式
第一行,数字n(n<10),表示下面有n个初始局面。
接下来,n行,每行一个串,表示开始的局面。
比如:“ ****** ”, 表示有6个空格。“L****”, 表示左边是一个字母L,它的右边是4个空格。
输出格式
要求输出n个数字,表示对每个局面,如果小明先填,当K大师总是用最强着法的时候,小明的最好结果。
1 表示能赢
-1 表示必输
0 表示可以逼平
样例输入
4
**
L** L
L ** L***L
L *****L
样例输出
0
-1
1
1
#include<bits/stdc++.h>
using namespace std;
int is_lol(string x)
{
int len=x.length();
if(x.find("LOL")!=string::npos)
return -1;//当我方开始填时已出现LOL时,则我方输
if(x.find("*")==string::npos)
return 0;//当没有出现LOL时,且没有空格则为平局
int ping=0;//先假设不为平局
for(int i=0;i<len;i++)//从当前状态的棋牌开始遍历操作
{
if(x[i]=='*') //找到一个空格,我们可以填入L或者O,然后再往下。也可以不选择这个空格,即回溯回来。
{
x[i]='L';//先填L试试
int t=is_lol(x);
if(t==-1)
return 1;//当我方填完后,出现LOL,则我方赢
if(t==0)
ping=1; //当我方填完后,没有空格,则为平局
x[i]='O';//再填O试试
t=is_lol(x);
if(t==-1)
return 1;//当我方填完后,出现LOL,则我方赢
if(t==0)
ping=1; //当我方填完后,没有空格,则为平局
x[i]='*';//或者不填
}
}
if(ping)
return 0;//如果存在平局,则结果为平局,否则即输
return -1;
}
int main()
{
int n;
cin>>n;
string x;
for(int i=1;i<=n;i++)
{
cin>>x;
cout<<is_lol(x)<<endl;
}
return 0;
}