蓝桥杯刷题021——填字母游戏(DFS)

news2024/12/27 3:50:50

2017国赛 

题目描述

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

题目大意 

给出只有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] = -1
        return -1
    elif "L*L" in s or "*OL" in s or "LO*" in s:    # 赢的局面
        di[s] = 1
        return 1
    elif "*" not in s and "LOL" not in s:    # 没有*且没有LOL,平局
        di[s] = 0
        return 0
    
    flag = -1                # 初始化为最差结果:输,当出现刚好的结果才会替换
    for i in range(n):
        ls = list(s)         # 需要修改字符串,先转成列表
        if ls[i] == "*":     # 遇到*才能填
            ls[i] = 'L'      # 小明填L
            last_r1 = dfs("".join(ls), n)  # dfs求上一轮的结果。"".join(ls)将对局状态转回字符串
            if last_r1 == -1:    # 上一轮是k大师的局输了
                di[s] = 1        # 相当于小明赢了
                return 1
            if last_r1 == 0:  # 上一轮是k大师的局平了
                flag = 0      # 相当于小明平了,这里不return 0,因为可能出现更好的结果:赢
            ls[i] = 'O'       # 小明填L
            last_r2 = dfs("".join(ls), n) # dfs求上一轮的结果。"".join(ls)将对局状态转回字符串
            if last_r2 == -1: # 上一轮是k大师的局输了
                di[s] = 1     # 相当于小明赢了
                return 1
            if 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)))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333915.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go语言的并发编程

并发编程是 Go语言的一个重要特性,而 go语言也是基于此而设计出来的。 本文将会介绍如何使用go-gc中的“runtime”方法实现 go语言中的并发编程。 在之前的文章中,我们已经对 runtime方法进行了详细介绍,这次文章将对 runtime方法进行深入分析,并讲解如何在go-gc中使用该方…

Java NIO学习(二):Channel通道

2.1 Channel 概述Java NIO 的通道类似流&#xff0c;但又有些不同&#xff1a;既可以从通道中读取数据&#xff0c;又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个 Buffer&#xff0c;或者总是要从一个 Buffer 中写入。2.2 Ch…

PrimoBurner SDK for .NET

PrimoBurner SDK for .NET PrimoBurnerSDK是一个CD、DVD和蓝光刻录工具开发工具包。PrimoBurner是跨平台的&#xff0c;它还提供了一个全面灵活的API&#xff0c;用于快速轻松地实现各种燃烧/翻录替代方案。现在PrimoBurner迫使许多卫生、国防、执法、娱乐和其他部门。 PrimoBu…

面试复习题--性能检测原理

1、布局性能检测 Systrace&#xff0c;内存优化工具中也用到了 Systrace,这里关注 Systrace 中的 Frames 页面&#xff0c;正常情况下圆点为绿色&#xff0c;当出现黄色或者红色的圆点时&#xff0c;表现出现了丢帧。 Layout Inspector&#xff0c;是 AndroidStudio 自带工具…

Python环境搭建、Idea整合

1、学python先要下载什么&#xff1f; 2、python官网 3、idea配置Python 4、idea新建python 学python先要下载什么&#xff1f; python是一种语言&#xff0c;首先你需要下载python&#xff0c;有了python环境&#xff0c;你才可以在你的电脑上使用python。现在大多使用的是pyt…

this指针

目录 一、关于this指针的一个经典问题 二、this指针的特点 &#xff08;一&#xff09;本质 &#xff08;二&#xff09;应用 1. 不使用this指针 2. 使用this指针 3. 两者代码对比 三、代码举例 1. 举例1 2. 举例2 一、关于this指针的一个经典问题 当你进入一个房子…

MySQL面试题:SQL语句的基本语法

MySQL目录一、数据库入门1. 数据管理技术的三个阶段2. 关系型数据库与非关系型数据库3. 四大非关系型数据库a. 基于列的数据库&#xff08;column-oriented&#xff09;b. 键值对存储&#xff08;Key-Value Stores&#xff09;c. 文档存储&#xff08;Document Stores&#xff…

In Context Learning 相关分享

个人知乎详见 https://zhuanlan.zhihu.com/p/603650082/edit 1. 前言 随着大模型&#xff08;GPT3&#xff0c;Instruction GPT&#xff0c;ChatGPT&#xff09;的横空出世&#xff0c;如何更高效地提示大模型也成了学术界与工业界的关注&#xff0c;因此In-context learning…

ArcGIS API for JavaScript 4.15系列(3)——Dojo中的css样式操作

1、前言 前一篇博客介绍了Dojo中基础的dom操作方法&#xff0c;主要是针对html中的常用标签和属性进行操作。而一个优秀的线上网站自然也离不开css样式的从旁辅助。在实际开发过程中&#xff0c;我们经常会遇到需要动态修改css样式的问题&#xff0c;本文就来介绍一下如何在Do…

大数据框架之Hadoop:入门(一)大数据概论

第1章 大数据概论 1.1大数据概念 大数据(Big Data)&#xff1a;指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决&#xff…

【java基础】集合

集合 集合类位于java.util 包下&#xff0c;集合类又被称为容器 与数组的区别 数组的长度是固定的&#xff0c;集合的长度是可变的数组可以用来存放基本数据类型&#xff0c;集合存放引用类型&#xff0c;不能存放基本数据类型 如何选择 collection map 黄色的是接口&…

1.计算机基础-操作系统面试题—计算机系统概述、进程管理

本文目录如下&#xff1a;计算机基础-操作系统 面试题一、计算机系统概述CPU 内核态 和 用户态 的区别&#xff1f;从 用户态 切换到 内核态 的常见方法&#xff1a;二、进程管理线程 和 进程 的区别&#xff1f;协程 (goroutine) 和 线程的区别?进程有哪些状态&#xff1f;进…

day11_类中成员之变量

通过以前的学习&#xff0c;我们知道了成员变量是类的重要组成部分。对象的属性以变量形式存在&#xff0c;下面我们就来详解的学习一下类中的变量 成员变量 成员变量的分类 实例变量&#xff1a;没有static修饰&#xff0c;也叫对象属性&#xff0c;属于某个对象的&#xf…

Transformer位置编码图解

在语言中&#xff0c;单词的顺序及其在句子中的位置非常重要。 如果重新排列单词&#xff0c;整个句子的意思可能会发生变化。 在实施 NLP 解决方案时&#xff0c;循环神经网络具有处理序列顺序的内置机制。 然而&#xff0c;transformer 模型不使用递归或卷积&#xff0c;而是…

面试(七)为什么一般希望将析构函数定义为虚函数

class B { public:~B() // 基类析构函数不为虚函数{cout << "B::~B()" << endl;} };class D : public B { public:~D(){cout << "D::~D()" << endl;} };void Test(B* t) {delete t;t nullptr; }int main() {B *pb new B;Test…

TCP/IP网络编程——I/O 复用

完整版文章请参考&#xff1a; TCP/IP网络编程完整版文章 文章目录第 12 章 I/O 复用12.1 基于 I/O 复用的服务器端12.1.1 多进程服务端的缺点和解决方法12.1.2 理解复用12.1.3 复用技术在服务器端的应用12.2 理解 select 函数并实现服务端12.2.1 select 函数的功能和调用顺序1…

anaconda下pytorchCPU GUP安装及问题记录

1 pytorch安装&#xff08;CPU版本&#xff09; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2 torchvision、torchaudio、torchtext安装&#xff1a;解决ModuleNotFoundError: No module named ‘torchvision‘问题 &#xff08…

用“AI“挑选一件智慧礼物

在久违的烟火气回归之际&#xff0c;充满希望的生活可能就从精心挑选一件新年礼物开始。在罗列礼品清单时&#xff0c;你会想到 “数据”也是其中之一吗&#xff1f;事实上&#xff0c;几乎所有时下最受欢迎的带有“智能”一词的设备&#xff0c;都是由大量高质量的数据创建。我…

面试必问的CAS,你懂多少?

目录一.什么是CAS&#xff1f;二.CAS实现过程三.CAS的缺点1.循环时间长2.只能保证一个共享变量是原子操作3.ABA问题和解决方法四.拓展题1.i和i是原子性操作吗&#xff1f;2. i 不加lock和synchronized怎么保证原子性&#xff1f;一.什么是CAS&#xff1f; CAS(Compare And Swa…

uboot源码结构、配置、编译和移植

目录 一、uboot源码结构 1.1 uboot源码获取 1.2 uboot的特点 1.3 uboot源码结构 二、uboot配置与编译 2.1uboot配置 2.2 uboot编译 三、uboot移植 3.1添加board信息 3.2再次配置和编译 3.3添加三星加密引导程序 3.4添加调制代码&#xff08;点灯法&#xff09; 3.…