当前位置: 首页 > news >正文

蓝桥杯 填字母游戏

填字母游戏

原题目链接

问题背景

小明沉迷 LOL。K 大师与他先玩一个“在空格中填字母”的小游戏:
两人轮流在一行格子中,把某个空格替换为 LO。谁先在整行字符串中形成子串 “LOL”,谁就获胜;若所有格子填满仍无法形成 “LOL”,则平局

游戏规则

  • 初始给定一行由 LO*(表示空格)组成的字符串。
  • 两名玩家轮流行动,每回合:
    • 选择任意一个 *,将其替换为 LO
  • 判定:
    • 任何时刻,一旦行内出现连续的 “LOL”,当前行动的玩家立刻获胜
    • 若所有 * 均被替换完仍未出现 “LOL”,则平局

目标

对每个给定的初始局面,假设小明先手且双方都采用最优策略,输出小明能达到的最好结果

  • 1:先手必胜;
  • 0:先手可保平;
  • -1:先手必败。

输入格式

  • 第 1 行:整数 nn < 10),表示有 n 个初始局面。
  • 接下来的 n 行:每行一个只包含 LO* 的字符串,表示一个初始局面(例如:
    • "******":6 个空格;
    • "L****":左端一个 L,其后 4 个空格)。

输出格式

  • 输出 n 行,每行一个整数,分别对应每个初始局面的最好结果:
    • 10-1(含义见上文“目标”)。

示例

输入

4
***
L**L
L**L***L
L*****L

输出

0
-1
1
1

c++代码

#include<bits/stdc++.h>using namespace std;int n;
string s;
unordered_map<string, int> mp;int result() {if (mp.find(s) != mp.end()) return mp[s];if (s.find("LOL") != -1) {mp[s] = -1; return -1;}if (s.find("*") == -1) {mp[s] = 0; return 0;}int key = -1;for (int i = 0; i < s.size(); i++) {if (s[i] != '*') continue;s[i] = 'L';int sym = result();if (sym == -1) {s[i] = '*';mp[s] = 1;return 1;}else if (sym == 0) key = 0;s[i] = 'O';sym = result();if (sym == -1) {s[i] = '*';mp[s] = 1;return 1;}else if (sym == 0) key = 0;s[i] = '*';}mp[s] = key;return key;
}int main() {cin >> n;while (n--) {cin >> s;cout << result() << endl;}return 0;
}

题目解析

博弈论(递归+回溯)

如果敌方必赢,那么我方必输,如果敌方必输那么我方必赢。否则可以平局。

if (sym == -1) {return 1;
}

int sym()的返回值表示,当前局面,先下棋的人的输赢。

我们枚举先下棋的人这一步的每一种下法。

for (int i = 0; i < s.size(); i++) {if (s[i] != '*') continue;s[i] = 'L';//...省略代码s[i] = '*';.//回溯//...省略代码s[i] = 'O';s[i] = '*';//回溯
}

然后下一步就轮到敌方下。我们再次调用sym函数获得敌方输赢。

s[i] = 'L';
int sym = result();
if (sym == -1) {//...return 1;
}

一直枚举每一种下法,直到已经分出胜负才停止。

如果敌方的每一种返回值都是必赢那么我们必输。

如果敌方只要有一个必输那么我们必赢。

否则可以平局。

记忆化搜索

递归过程中会出现很多重复情况,而每一种情况的返回值都是一样的。

为了不重复走我们已经模拟过的情况,我们用unorder_map把我们走过的每一种情况存储下来。

下次我们遇到重复的情况的时候,直接返回存储的值,而不是再次递归搜索。

if (mp.find(s) != mp.end()) return mp[s];
http://www.dtcms.com/a/462917.html

相关文章:

  • javascript开发app教程
  • 域名备案怎么关闭网站wordpress 页面下文章列表
  • SQL入门: HAVING用法全解析
  • 做卷闸门网站有用吗微信小程序商城怎样做
  • 买域名建网站价格青海网页设计
  • 大模型激活值所占用的内存与序列长度、模型维度的解析
  • 持续学习(Continual Learning):让AI像人类一样终身成长
  • 手机版网站推荐个人养老保险怎么交
  • kali制作钓鱼网站
  • seo整站优化方法wordpress跟随按钮怎么做
  • 海外建站服务平台涟水建设银行网站
  • 如何破解网站后台密码防水网站建设
  • 怎么做类似站酷的网站建设充值网站多钱
  • 如何把电脑改成服务器 做网站大连建站费用
  • 网站建设规模用什么形容西宁好的网站建设
  • c++26新功能—indirect<T>和polymorphic<T>
  • 网站建设方案文本模板网站服务器环境不支持mysql数据库
  • 网站建设费可以一次性冲费用吗手机免费建设网站制作
  • string的自主实现
  • usart波特率为9600和115200时,发送一句话所耗费的时间分别是多少
  • 灌南住房建设局网站网站建设收费标准不一
  • 前端学习手机网站开发吗黄金网站软件免费
  • 网站建设认知与理解营销平台建设
  • 免费创建属于自己的网站呼和浩特百度seo
  • k8s-pod部署java应用,jvm内存正常,但是pod内存不足oom排查
  • 公司网站建设合同需要交印花税中山专业网站建设模板代理
  • 网站开发需要解决难题项目网络图经常被称为
  • OSPF的高级特性
  • 安徽省建设工程造价管理网站wordpress嵌入php代码
  • 专门做网站的app怎样做网络推广优选豪升网络好