蓝桥杯刷题021——填字母游戏(DFS)
2017国赛
题目描述
小明经常玩 LOL 游戏上瘾,一次他想挑战 K 大师,不料 K 大师说:
"我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩 LOL 了"。
K 大师在纸上画了一行 n 个格子,要小明和他交替往其中填入字母。
并且:
轮到某人填的时候,只能在某个空格中填入 L 或 O。
谁先让字母组成了"LOL"的字样,谁获胜。
如果所有格子都填满了,仍无法组成 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
题目大意
给出只有L,O,*三个字符组成的字符串,小明和K大师轮流往*的位置填L或O
谁先填出“LOL”,谁就获胜
问小明先填,最后求出小明的最好结果,1表示小明获胜,-1表示小明失败,0表示双方平局
思路:
小明填时,可以直接判断胜负的情况
字符串里存在“LOL”:小明会输,此时-1就是结果
字符串里存在“L*L”,“LO*”,“*OL”:小明会赢,此时1就是结果
字符串里没有“*”时,且不存在“LOL”:当前局面是平局,此时0就是结果
# 填字母的过程
- 填字母的过程,实质上是一个DFS的过程(DFS:可求解是否存在路径等问题),而本题刚好是判断是否直接分出结果
- 每一次填字母,都可以任选一个*的位置,该位置上可以填上L或O
- 搜索直到能分出胜负或者没有*时平局为止
- 剪枝:这个局面先前已经判断过,可直接返回对应的结果。用一个字典dp{}保存结果,键:状态,值:对局结果
解题关键:DFS+记忆状态+剪枝
- 定义一个字典记录所有状态的胜负结果
- 从字符串开始状态进行DFS
- 重复性剪枝:当前局面在字典中出现过,直接返回对应的结果。
- 搜索结束:当前局面可以直接判断结果(三种可以直接判断的结果:LOL、“L*L”,“LO*”,“*OL”、没有“*”时,且不存在“LOL”)
- 如果不能直接判断结果和不能剪枝,那么遍历当前局面所有的*位置,对填L和O的两种情况进行DFS搜索判断
tips:针对上面是否可以直接判断出结果,我们可以通过判断该子串是否在该字符串中来确定,可以用in方法,例如"LOL" in s,存在的话返回True,否则返回False。也可以使用find方法,例如s.find("LOL"),存在的话返回该子串首字符在字符串的下标,否则返回-1
代码
n = int(input())def dfs(s, n):if s in di.keys(): # 之前出现过该局面,直接返回结果return di[s]if "LOL" in s: # 出现LOL,输了di[s] = -1return -1elif "L*L" in s or "*OL" in s or "LO*" in s: # 赢的局面di[s] = 1return 1elif "*" not in s and "LOL" not in s: # 没有*且没有LOL,平局di[s] = 0return 0flag = -1 # 初始化为最差结果:输,当出现刚好的结果才会替换for i in range(n):ls = list(s) # 需要修改字符串,先转成列表if ls[i] == "*": # 遇到*才能填ls[i] = 'L' # 小明填Llast_r1 = dfs("".join(ls), n) # dfs求上一轮的结果。"".join(ls)将对局状态转回字符串if last_r1 == -1: # 上一轮是k大师的局输了di[s] = 1 # 相当于小明赢了return 1if last_r1 == 0: # 上一轮是k大师的局平了flag = 0 # 相当于小明平了,这里不return 0,因为可能出现更好的结果:赢ls[i] = 'O' # 小明填Llast_r2 = dfs("".join(ls), n) # dfs求上一轮的结果。"".join(ls)将对局状态转回字符串if last_r2 == -1: # 上一轮是k大师的局输了di[s] = 1 # 相当于小明赢了return 1if last_r2 == 0: # 上一轮是k大师的局平了flag = 0 # 相当于小明至少平了,这里不return 0,因为可能出现更好的结果:赢 di[s] = flag # 最终结果return di[s] # 最终返回对局结果for i in range(n):di = {} # 记录所有的状态s = input() # 每个局面的起始状态print(dfs(s, len(s)))
蓝桥杯刷题021——填字母游戏(DFS)相关推荐
- 2017年第八届蓝桥杯C/C++ A组国赛 —— 第四题:填字母游戏
标题:填字母游戏 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格 ...
- 蓝桥杯 历届试题 填字母游戏
文章目录 问题描述 输入格式 输出格式 样例输入 样例输出 解题思路: 解题代码: 问题描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的 ...
- Java实现蓝桥杯历届试题填字母游戏
题目描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了".K大师在纸上画了一行n个格子,要小明 ...
- 蓝桥杯- 历届试题 填字母游戏
传送门 问题描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格 ...
- 2017年第八届蓝桥杯 JavaB组国赛 第五题 填字母游戏
标题:填字母游戏 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格 ...
- 【蓝桥杯刷题冲刺辅导】掌握递归·DFS解题套路,这一文足以?
大家好,我是安然无虞. 目录 一.刷题前和铁汁们唠一唠 1.刷题前须知 2.刷题时套路 <1>套路 <2>背下列常用数 <3>投机取巧:根据数据范围确定算法 ...
- 蓝桥杯---试题 历届试题 填字母游戏(博弈)
试题 历届试题 填字母游戏 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏 ...
- c语言填字母游戏蓝桥杯,蓝桥杯2017国赛JAVAB组 填字母游戏 题解
标题:填字母游戏 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格 ...
- 蓝桥杯2017国赛JAVAB组 填字母游戏 题解
标题:填字母游戏 小明经常玩 LOL 游戏上瘾,一次他想挑战K大师,不料K大师说: "我们先来玩个空格填字母的游戏,要是你不能赢我,就再别玩LOL了". K大师在纸上画了一行n个格 ...
最新文章
- 每天一道LeetCode-----使用最少的操作将一个字符串转换成另一个字符串,只有插入,删除,替换三种操作
- 发送http和https请求工具类 Json封装数据
- 什么样的研究有价值?
- CombineFileInputFormat 文件分片总结
- Redis学习---(13)Redis 发布订阅
- 洪雅中学成绩2021高考查询,洪雅中学2021年排名
- CMMI5 2.0版本是什么 做什么
- 华为NP课程笔记9-BGP 3
- Solr数据库6.3.0版本配置问题:whose UTF8 encoding is longer than the max length 32766
- Java学生管理系统设计与实现 (超详细,含课程设计)
- 53.创建线程_beginthread
- P4 用verilog描述单周期CPU的学习笔记和总结(基于P3)
- 敏感词屏蔽工具(DFA算法)
- windows 注册表固定桌面壁纸
- pentaho安装mysql驱动_在Pentaho数据集成中安装MySQL JDBC驱动
- 国际知名芯片专家,加盟武昌理工学院人工智能学院
- Selenium 2自动化测试实战
- mate7tl10是Android,华为Mate 7 MT7-TL10官方线刷包安卓5.1.1Rom刷机包
- 【巷子】---webpack配置非CMD规范的模块
- MYSQL如何制作资产负债表_资产负债表该如何制作呢?搞定资产负债表,仅需这5步!...