问题描述
  小明经常玩 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

//解题思路:这一题是含有平局的无偏博弈问题。博弈问题一般思路:
f( 当前局势  )
{
    临界条件
    
    t = 负
    for( 所有步数 ){
        t = f(尝试走一步)
        if( t==负 ) return 胜
        if( t==平 ) t = 平
    }
    return t
}
即尝试一步,改变当前局势,交给对方处理。每一方都尽可能希望胜利,其次平局。
这里直接用dfs()会超时,可以用C++ map 将一个局势 和 最终结果一一对应。 map.find()如果未找到 则 == map.end()  string.find()未找到返回-1
 
//实现代码:
#include<iostream>
#include<string>
#include<map>
using namespace std; //输入
int n;
string str;//当前状态 map<string,int> m;//键值对 用来把相同状况剪枝 int dfs(string str)// 返回 1 0 -1
{
if( m.find(str)!=m.end() ){
return m[str];//如果重复 剪枝
} if( (str.find("LO*")+)||(str.find("*OL")+)||(str.find("L*L")+)){
return m[str] = ;//如果发现任意一个 则胜利(+1后返回值>=1 未找到返回0)
}
/*** 上面代码如果改为
if( str.find("LOL") ){
return m[str] = -1;//如果发现任意一个 则胜利(+1后返回值>=1 未找到返回0)
}
逻辑上也是对的 但运行会超时 大概是多了不必要的递归 ***/
if( str.find('*')==- ){
return m[str] = ;//没有空位* 则平局
} int flat = -;
for(int i=; i<str.length(); i++)
{
if( str[i] != '*' )
{
continue;
}
//尝试两种方式
str[i] = 'L';
if( dfs(str)==- ){
str[i] = '*';//这里要先回溯为传入时的状态 再存入map
return m[str] = ;
} if( dfs(str)== ){
flat = ;
} str[i] = 'O';
if( dfs(str)==- ){
str[i] = '*';
return m[str] = ;
} if( dfs(str)== ){
flat = ;
} str[i] = '*';//回溯
} return m[str] = flat;
} void solve()
{
int res = dfs(str);
cout<<res<<endl;
} int main()
{
cin>>n;
while( n-- )
{
cin>>str;
solve();
}
return ;
}

蓝桥杯 试题 历届试题 填字母游戏 博弈+dfs剪枝的更多相关文章

  1. [蓝桥杯]PREV-23.历届试题_数字游戏

    问题描述 栋栋正在和同学们玩一个数字游戏. 游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈.栋栋首先说出数字1.接下来,坐在栋栋左手边的同学要说下一个数字2.再下面的一个同学要从上一个同学说的数 ...

  2. [蓝桥杯]PREV-44.历届试题_青蛙跳杯子

    问题描述 X星球的流行宠物是青蛙,一般有两种颜色:白色和黑色. X星球的居民喜欢把它们放在一排茶杯里,这样可以观察它们跳来跳去. 如下图,有一排杯子,左边的一个是空着的,右边的杯子,每个里边有一只青蛙 ...

  3. [蓝桥杯]PREV-27.历届试题_蚂蚁感冒

    问题描述 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂 ...

  4. [蓝桥杯]PREV-26.历届试题_最大子阵

    问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和 ...

  5. [蓝桥杯]PREV-25.历届试题_城市建设

    问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在 ...

  6. [蓝桥杯]PREV-22.历届试题_国王的烦恼

    问题描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险. 如果两个小岛间 ...

  7. [蓝桥杯]PREV-21.历届试题_回文数字

    问题描述 观察数字:, 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做:回文数字. 本题要求你找到一些5位或6位的十进制数字.满足如下要求: 该数字的各个数位之和等于输入 ...

  8. [蓝桥杯]PREV-19.历届试题_九宫重排

    题目描述: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1 ...

  9. [蓝桥杯]PREV-15.历届试题_格子刷油漆

    题目描述: 代码如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MOD ...

随机推荐

  1. 如何迅速分析出系统CPU的瓶颈在哪里?

    内容出自极客时间专栏<Linux 性能优化实战> CPU 的性能指标那么多,CPU 性能分析工具一抓一大把,换成实际的工作场景,该观察什么指标.选择哪个性能工具呢? 不要担心,今天我就以多 ...

  2. 15个Nodejs应用场景

    15个Nodejs应用场景 我们已经对Nodejs有了初步的了解,接下来看看Nodejs的应用场景. 2.1 Web开发:Express + EJS + Mongoose/MySQL express  ...

  3. spring-boot下mybatis的配置

    问题描述:spring boot项目想添加mybatis的配置,在src/main/resources目录下新建了mybatis-config.xml文件,在application.propertie ...

  4. 基于Swoole的HTTP/HTTPS代理

    N行代码实现一个简单的代理服务器 <?php /** * Web代理服务器(支持http/https) * @author zhjx922 */ class WebProxyServer { p ...

  5. 编写C#程序的IDE

    编写C#程序,在Windows平台下,除了昂贵的Visual Studio.NET这个正宗的工具外,你还了解哪些? 听说有个Eclipse,IBM投钱开发的开源工具,有人也做了个for .NET的pl ...

  6. Linux下进程的创建(system(); fork(); exec*())

    0. system(); system()函数通过调用shell程序来执行所指向的命令(效率低),相当于先fork(),再execve(): 特点:原进程和子进程各自运行,且原进程需要等子进程运行完后 ...

  7. #Week4 Logistic Regression

    一.Classification 主要讨论二元分类. 线性回归处理分类问题显然不靠谱,所以采用逻辑回归. 二.Hypothesis Representation 假设函数变为\(h_\theta(x) ...

  8. Leetcode---Solutions&Notes

    Leetcode已经成为面试必备技能之一,为了紧随潮流,也模仿大佬们刷刷题. 1.采用"龟系"做法,每道题尽量做到时间复杂度和空间复杂度的较优水平: 2.每道题的Solution先 ...

  9. Fiddler 弱网测试

    1.设置上传下载速率 在Fiddler Script选项中查找uploaded,找到设置网络上传和下载设置值 分析一下这几行代码: 首先来判断 m_SimulateModem 是否为 true,也就是 ...

  10. 一只简单的网络爬虫(基于linux C/C++)————支持动态模块加载

    插件在软件设计中有很大的好处,可以方便地扩展各种功能,使用插件技术能够在分析.设计.开发.项目计划.协作生产和产品扩展等很多方面带来好处: (1)结构清晰.易于理解.由于借鉴了硬件总线的结构,而且各个 ...