蓝桥杯 填数字游戏 20分。

小明经常玩 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;
} 

猜你喜欢

转载自blog.csdn.net/henulmh/article/details/104735971