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

字符串的特殊读取——基于蓝桥杯两道题目(C/C++)

目录

1  例题

1.1  卡片换位

1.2  人物相关性分析

2  字符串的读取

2.1  综述

2.2  scanf

2.3  getline/getchar/get

2.4  注意

2.5  说明


先看例题

1  例题

1.1  卡片换位

问题描述
你玩过华容道的游戏吗?
这是个类似的,但更简单的游戏。
看下面 3 x 2 的格子
在其中放5张牌,其中A代表关羽,B代表张飞,* 代表士兵。
还有一个格子是空着的。
你可以把一张牌移动到相邻的空格中去(对角不算相邻)。
游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。

输入格式:
输入两行6个字符表示当前的局面

输出格式:
一个整数,表示最少多少步,才能把AB换位(其它牌位置随意)
 

这道题第一眼是很难想到是一道搜索题,原因在于没有对空格进行一个正确的理解:

我们知道一个人物可以挪到空格去,但我们可以这样想,

空格也可以代表一个人物(这里将他命名为K),这个人物的特殊之处在于他可以与周围的任何一个人交换位置。

那么我们在最开始的时候就记录几个特殊点的坐标:A关羽,B张飞,K空格,就能够设置搜索的边界了

那么进行搜索时总要有一个开始点,不妨我们选择让空格主动出击,主动去和周围的人物交换,进行上下左右的尝试

每dfs一次就是对华容道阵容的一次更新

重点思路就是这样,下面看一下代码的具体实现

代码(附讲解):

#include <bits/stdc++.h>
using namespace std;
int Min=INT_MAX;//设置成最大值
struct
{int x,y;	
}a,b,k;//结构体定义A,B,空格坐标
int vis[3][3][3][3][3][3];//记忆化搜索
int Next[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//上下左右走void dfs(int x1,int y1,int x2,int y2,int x,int y,int step)
{if(step>Min) return;//边界1,走不出去了if(x1==b.x&&y1==b.y&&x2==a.x&&y2==a.y)//边界2,交换完成{Min=min(step,Min);return;}if(x<0||x>1||y<0||y>2) return;//边界3,走出迷宫边界if(vis[x1][y1][x2][y2][x][y]==1) return;//边界4,已经搜索过这种情况了vis[x1][y1][x2][y2][x][y]=1;//开始dfs主干部分for(int i=0;i<4;i++)//四个方向搜索{int tx=x+Next[i][0];int ty=y+Next[i][1];if(tx==x1&&ty==y1)//空格与A交换位置{dfs(x,y,x2,y2,x1,y1,step+1);} else if(tx==x2&&ty==y2)//空格与B交换位置{dfs(x1,y1,x,y,x2,y2,step+1);} else//空格与*交换位置{dfs(x1,y1,x2,y2,tx,ty,step+1); }}vis[x1][y1][x2][y2][x][y]=0;//回溯 
} int main()
{for(int i=0;i<2;i++){for(int j=0;j<3;j++){char s=getchar();//字符串读取后续讲解1if(s=='A') {a.x=i;a.y=j;} if(s=='B'){b.x=i;b.y=j;}if(s==' '){k.x=i;k.y=j;}}getchar();//字符串读取后续讲解2}dfs(a.x,a.y,b.x,b.y,k.x,k.y,0);printf("%d",Min);return 0;
}

1.2  人物相关性分析

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。 例如以下文本: ThisisastoryaboutAliceandBob.AlicewantstosendaprivatemessagetoBob. 假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob. Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。 注意: 1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。 2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如 Bobbi 並不算出现了 Bob。
【输入格式】
第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超 过 1000000。
【输出格式】
输出一个整数,表示 Alice 和 Bob 同时出现的次数。
 

这道题主要考察对细节的处理和对字符串的读取。

首先需要读取这个字符串,关于这个字符串的读取放到后面讲解

然后就是要计算出符合条件的Alice和Bob所在的位置,注意这里的符合条件是指Alice和Bob后面一个字符不是字母(根据常识前面一位不可能是字母)

最后遍历Alice数组,采用双指针法维护Bob动态窗口(反过来也可),找出符合条件的区间,记录答案

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;int main() 
{ios::sync_with_stdio(false);int k;string s;ll ans=0;cin >> k;cin.get();//字符串读取后续讲解3 getline(cin, s);//字符串读取后续讲解4vector<ll>Alice,Bob;for (ll i = 0; i < s.size();) {if (s.substr(i, 5) == "Alice") {if (i - 1 >= 0 && isalpha(s[i - 1]) || i + 5 < s.size() && isalpha(s[i + 5]))//不满足条件的情况 字符串读取后续讲解5continue;Alice.push_back(i);i += 5;} else if (s.substr(i, 3) == "Bob") {if (i - 1 >= 0 && isalpha(s[i - 1]) || i + 3 < s.size() && isalpha(s[i + 3]))//不满足条件的情况continue;Bob.push_back(i);i += 3;} else i++;}for(ll i = 0,l=0,r=0; i < Alice.size(); i++){  //遍历Alice数组元素 while(l < Bob.size() && Bob[l] <  Alice[i] - k - 3)    l++;   //维护窗口左边界 while(r < Bob.size() && Bob[r] < Alice[i] + k + 5)   r++;   //维护窗口右边界 ans += r - l;             //答案加上窗口中元素个数 }cout<<ans;return 0;
}

遍历Alice数组那一部分-k-3和+k+5的原因是:

我们记录的Alice和Bob的位置指的是记录A和B的位置(即首字母的位置),如果Alice在Bob前面,Alice和Bob之间空了k个字符,那么A和B之间空了(k+5)个字符。同理,如果Alice在Bob前面,Alice和Bob之间空了k个字符,那么A和B之间空了(k+3)个字符。

另外,left指针遇到符合条件的值就不再移动,所以left指针最终指向的是不符合条件的值。

right指针遇到不符合条件的值就不再移动,所以right指针最终指向的是符合条件的值

窗口的左边界是不可取的值,窗口的右边界是可取的值,即符合条件的范围是(left,right],所以ans计算方式如上

2  字符串的读取

2.1  综述

由上面两道题,我们可以发现学好字符串的读取和原理还是很有必要的

字符串或字符的输入有好多个函数,scanf、getline()、cin.getline()、cin.get()、gets()、getchar()等

先得出大致结论:

如果输入是不带空格的字符串,那用什么都可以了,建议用scanf或cin(最好用scanf,因为scanf的读取比cin快,同理printf的读取比cout快)

如果输入带空格,那scanf、cin就用不了了,可以考虑以下方法:
如果想用string类型的话,就用getline(cin, s)
如果想用字符数组类型的话,可以用**cin.getline()、cin.get()、gets(),**这里不是特别建议用gets(),因为这个函数可能会出点奇怪的问题,也不建议用cin.get(), 因为这个函数既不能忽略缓冲区的换行符,还不能在输入后抹掉自己的结束符,建议使用cin.getline()
如果输入的时候是单个字符,或者只想要字符串的第一个字符,就可以用getchar()、cin.get()
下面进行具体的讲解:

2.2  scanf

scanf用于字符串数组,遇到空格或换行就停止

char str[10];
scanf("%s", str);
cout<<str<<endl;

2.3  getline/getchar/get

可以接受空格,读取时遇到换行符结束

getline有两种读取方法,法一是string流,法二是iostream流,是两个不一样的函数

方法一:(这里还是建议用方法一)

使用string

string str;
getline(cin, str);
cout<<str<<endl;

方法二:

使用字符串数组

char str[100];
cin.getline(str, 20, '\n')
//cin.getline()里面三个参数,第一个是要储存的字符串数组,第二个是最大长度 + 1,最后一个位置用来存储'\0',也就是说你填20,但是只能存前19个字符,第三个是结束符,可省略,默认是换行符

getchar一次只能读取一个字符

2.4  注意


程序的输入都建有一个缓冲区,每次输入的过程,其实是计算机先将输入的数据存在输入缓冲区中,而我们使用的输入函数是直接从缓冲区中读取数据。使用cin的时候,遇到空格和换行符和tab键就会停止,此时缓冲区就会有残留数据:空格、换行符、tab。cin和cin.get()从缓冲区读入的时候会自动忽略第一个空格、换行符、tab,就可以正常读入字符串,但有些函数并不能,比如 getline,gets,get, 他们就会直接读取缓冲区剩余的空格、换行符、tab,就导致需要输入的输不进去。

所以如果你使用getline()或gets()或者cin.get()之前用了cin或cin.get(),请务必在cin后面加个getchar();
概括一下:

scanf和cin这类输入的方法不能记录空格、换行、tab的信息,所以这两种输入方法对空格、换行、tab很敏感,他们一遇到空格、换行、tab就只能中止读取(在一开头就空格、换行、tab直接无视),并且空格、换行、tab的字符并不能从缓冲区带走,导致缓冲区有残余,如果这个时候再用get一类的函数,就会出问题

举例:

string s;

cin>>s;

假设我们输入了abcdefg,为了结束输入,我们换行

此时计算机认为我们输入了abcdefg\n,然后abcdefg离开缓冲区,\n残留在缓冲区,如果下一步继续用get等函数,就会直接读取\n,出现错误

get这类函数对空格、换行、tab不敏感,把空格、换行、tab同样当做字符读取,在换行之后,同样地\n留在缓冲区,再用读取函数容易导致错误

所以get这种函数最常见的应用就是吃字符

 比如例题2的读取华容道,我们在输入每一个信息之后都会有空格或者换行代表输入的中止,为了消除这个中止字符对后续读取的影响,我们要加一个getchar()或者getline()把中止字符吃掉

如果你看懂了前面的说明,那么这个时候你就可以知道:

用cin/scanf之后不能盲目用getchar/getline/get,如果要用,就要在cin后吃字符

用getchar/getline/get之后可以用cin/scanf

2.5  说明

其实很多时候,我们是不用刻意关心字符的精读这个问题的

只有在题目要求需要读取空格等特殊字符时我们再进一步考虑

相关文章:

字符串的特殊读取——基于蓝桥杯两道题目(C/C++)

目录 1 例题 1.1 卡片换位 1.2 人物相关性分析 2 字符串的读取 2.1 综述 2.2 scanf 2.3 getline/getchar/get 2.4 注意 2.5 说明 先看例题 1 例题 1.1 卡片换位 问题描述 你玩过华容道的游戏吗&#xff1f; 这是个类似的&#xff0c;但更简单的游戏。 看…...

[足式机器人]Part3机构运动微分几何学分析与综合Ch01-4 平面运动微分几何学——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch01-4 平面运动微分几何学1.2.3-2 点轨迹的Euler-Savary公式1.2.4 高阶曲率理论1.2.3-2 点轨迹的Euler-Savary公式 例1-7&#xff1a; 平面曲柄摇杆机构的 Euler-Sa…...

【每日一题Day120】LC2341数组能形成多少数对 | 哈希表 排序

数组能形成多少数对【LC2341】 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数从 nums 中 移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一…...

win11/10+opencv3.x/4.x配置 VS2019方法(简单使用,亲测)

首先下载 opencv&#xff0c;去官网下载百度》输入opencv&#xff0c;点击opencv|home&#xff0c;进入官网。点击 “Library”---->Release点击 对应版本下的 window版本&#xff0c;点击 --安装--extract---》设置路径。这个就是把库文件扩展到指定的路径下&#xff0c;扩…...

HTTP协议---详细讲解

目录 一、HTTP协议 1.http 2.url url的组成&#xff1a; url的保留字符&#xff1a; 3.http协议格式​编辑 ①http request ②http response 4.对request做出响应 5.GET与POST方法 ①GET ②POST 7.HTTP常见Header ①Content-Type:: 数据类型(text/html等)在上文…...

Syntax-Aware Aspect-Level Sentiment Classification with PWCN 论文阅读笔记

一、作者 Chen Zhang, Qiuchi Li, and Dawei Song. 2019. Syntax-Aware Aspect-Level Sentiment Classification with Proximity-Weighted Convolution Network. In Proceedings of the 42nd International ACM SIGIR Conference on Research and Development in Information …...

hadoop考试应急

概述 四大特点&#xff1a;大量化、快速化、多元化、价值化 关键技术&#xff1a;采集、存储管理、处理分析、隐私和安全 计算模式&#xff1a;批处理、流、图、查询分析计算 Hadoop处理架构 了解就好 2007年&#xff0c;雅虎在Sunnyvale总部建立了M45——一个包含了4000…...

【React】Hooks

&#x1f6a9;&#x1f6a9;&#x1f6a9; &#x1f48e;个人主页: 阿选不出来 &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;个人简介: 一名大二在校生,学习方向前端,不定时更新自己学习道路上的一些笔记. &#x1f4a8;&#x1f4a8;&#x1f4a8; &#x1f48e;目…...

升级Room引发的惨案!!

kotlin升级 在升级kotlin的时候&#xff0c;直接升级到大版本的kotlin&#xff08;比如1.7以上&#xff09;&#xff0c;直接报错&#xff0c;只是报错不知道原因。 koltin Release details 后来把koltin版本改成1.6.0&#xff0c;报如下的错&#xff0c;我们才知道gradle是需…...

RPC框架:一文带你搞懂RPC

RPC是什么&#xff08;GPT答&#xff09; ChatGPT回答&#xff1a; RPC(Remote Procedure Call)是一种分布式应用程序的编程模型&#xff0c;允许程序在不同的计算机上运行。它以一种透明的方式&#xff0c;将一个程序的函数调用定向到远程系统上的另一个程序&#xff0c;而使…...

电子招标采购系统源码—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0…...

P16 激活函数与Loss 的梯度

参考&#xff1a;https://www.ngui.cc/el/507608.html?actiononClick这里面简单回顾一下PyTorch 里面的两个常用的梯度自动计算的APIautoGrad 和 Backward, 最后结合 softmax 简单介绍一下一下应用场景。目录&#xff1a;1 autoGrad2 Backward3 softmax一 autoGrad输入 x输出损…...

ThinkPHP5美食商城系统

有需要请私信或看评论链接哦 可远程调试 ThinkPHP5美食商城系统一 介绍 此美食商城系统基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。用户注册登录后可购买美食&#xff0c;个人中心&#xff0c;评论和反馈等&#xff…...

Vue3 - $refs 使用教程,父组件调用获取子组件数据和方法(setup() / <script setup>)

前言 在 Vue2 中父组件使用 $refs 调用子组件数据和方法非常简单,但在 Vue3 中这种方法行不通了。 本文实现了 Vue3 中父组件使用 $refs 获取调用子组件数据和方法教程, 并且提供了 setup() 与 <script setup> 两种 “开发模式” 的示例代码,请根据需要进行选择。 网…...

华为OD机试 - 众数和中位数(Python)| 真题+思路+考点+代码+岗位

众数和中位数 题目 众数是指一组数据中出现次数多的数 众数可以是多个中位数是指把一组数据从小到大排列,最中间的那个数, 如果这组数据的个数是奇数,那最中间那个就是中位数 如果这组数据的个数为偶数,那就把中间的两个数之和除以 2 就是中位数查找整型数组中元素的众数并…...

一眼万年的 Keychron 无线机械键盘

一眼万年的 Keychron 无线机械键盘 一款好的键盘对于程序员或者喜欢码字的人来说是非常重要的&#xff0c;而最近博主入手了自己的第一款机械键盘——Keychron 无线机械键盘。 机械键盘特点 有独立轴体&#xff0c;通过两个簧接触&#xff0c;来触发信号&#xff0c;价格相对贵…...

自动化测试高频面试题(含答案)

Hello&#xff0c;你们的好朋友来了&#xff01;今天猜猜我给大家带来点啥干货呢&#xff1f;最近很多小伙伴出去面试的时候经常会被问到跟自动化测试相关的面试题。所以&#xff0c;今天特意给大家整理了一些经常被公司问到的自动化测试相关的面试题。停&#xff0c;咱先收藏起…...

3、按键扫描检测处理

说明&#xff1a;本文处理按键的短按、长按检测执行&#xff0c;非矩阵按键 硬件可以类似如下连接即可&#xff0c;无需放置上下拉电阻&#xff1b; 按键动作分长按、短按(弹起时执行)两种 按下不放执行长按&#xff0c;但松开按键时不予执行短按函数 多个按键可以同时操作 按…...

集中式存储和分布式存储

分布式存储是相对于集中式存储来说的&#xff0c;在介绍分布式存储之前&#xff0c;我们先看看什么是集中式存储。不久之前&#xff0c;企业级的存储设备都是集中式存储。所谓集中式存储&#xff0c;从概念上可以看出来是具有集中性的&#xff0c;也就是整个存储是集中在一个系…...

【机器学习数据集】如何获得机器学习的练习数据?

一、scikit-learn自带数据集Scikit-learn内置了很多可以用于机器学习的数据&#xff0c;可以用两行代码就可以使用这些数据。自带的小的数据集为&#xff1a;sklearn.datasets.load_<name>load_bostonBoston房屋价格回归506*13fetch_california_housing加州住房回归20640…...

【编程实践】使用 Kotlin HTTP 框架 Fuel 实现 GET,POST 接口 kittinunf.fuel【极简教程】

目录 Fuel 简介 实现代码 GET网络请求用法(有三种写法࿰...

大数据DataX(一):DataX的框架设计和插件体系

文章目录 DataX的框架设计和插件体系 一、DataX是什么...

软考高级信息系统项目管理师系列之十一:项目进度管理

软考高级信息系统项目管理师系列之十一:项目进度管理 一、进度管理领域输入、输出、工具和技术表二、项目进度管理1.项目进度管理过程2.项目进度管理三、项目进度管理过程1.项目进度管理2.工作包和活动3.活动清单4.活动属性5.项目进度网络图6.资源日历7.活动资源需求8.资源分解…...

vue2版本《后台管理模式》(下)

文章目录前言一、home 页以下都属于home子组件二、header 头部 组件二、Menu 页面三、Bread 面包屑四、Footer五 、分页器&#xff1a; Pageing![在这里插入图片描述](https://img-blog.csdnimg.cn/fbe9bb7e84a04ccda4d3fc9f4ab9c36b.png#pic_center)六、权限管理总结前言 这章…...

软考中级-程序设计语言

&#xff08;1&#xff09;解释器解释源程序时不生成独立的目标代码&#xff0c;源程序和解释程序都参与到程序执行中。&#xff08;2&#xff09;编译器编译时生成独立的目标代码&#xff0c;运行时是运行与源程序等价的目标程序&#xff0c;源程序不参与执行。阶段补充&#…...

Sphinx : 高性能SQL全文检索引擎

Sphinx是一款基于SQL的高性能全文检索引擎&#xff0c;Sphinx的性能在众多全文检索引擎中也是数一数二的&#xff0c;利用Sphinx&#xff0c;我们可以完成比数据库本身更专业的搜索功能&#xff0c;而且可以有很多针对性的性能优化。 Sphinx的特点 快速创建索引&#xff1a;3分…...

ansible实战应用系列教程6:管理ansible变量

ansbile实战应用系列教程6:管理ansible变量 Ansible VariablesNaming VariablesDefining Variables在playbook中定义变量Defining Variables in Playbooks在playbooks中使用VariablesHost Variables and Group Variables使用group_vars和host_vars目录命令行定义全局变量Varia…...

java8新特性Stream流中anyMatch和allMatch和noneMatch的区别详解

1、anyMatch 判断数据列表中是否存在任意一个元素符合设置的predicate条件&#xff0c;如果是就返回true&#xff0c;否则返回false。 接口定义&#xff1a; boolean anyMatch(Predicate<? super T> predicate); 方法描述&#xff1a; 在anyMatch 接口定义中是接收 Pr…...

双网卡(有线和wifi)同时连接内网和外网

双网卡&#xff08;有线和wifi&#xff09;同时连接内网和外网 Win10技巧&#xff1a;如何修改有线/WiFi网络优先级&#xff1a;https://www.ithome.com/html/win10/253612.htm双网卡实现两个网络的自由访问&#xff1a;https://blog.51cto.com/ghostlan/1299090Linux服务器安…...

如何赋能智能运维,迈出数字化黑匣子第一步?

在当下大数据时代&#xff0c;诸多行业专家为企业智能运维绘出美好蓝图。在该蓝图中&#xff0c;互联网、云计算、大数据分析联合发力&#xff0c;企业在能“攻”能“守”中快速、可持续发展。何为“攻”&#xff1f;对支撑企业产品研发、生产、管理、营销等各业务链条的IT基础…...

网站建设合同 费用/百度宁波营销中心

如何通过计算机的命令提示符(cmd.exe)连接 Oracle 数据库?DOS命令行连接oracle数据库假设有一个 Oracle 数据库信息如下&#xff1a;IP:192.168.0.1SID:orcl端口号&#xff1a;1521用户名&#xff1a;testuser密码&#xff1a;123456在本地客户端中配置的服务名为&#xff1a;…...

石家庄专业做网站/seo网络推广什么意思

一、二叉树最大深度(高度) //求二叉树最大深度/高度(DFS)public int maxDepth1(Node root) {if(rootnull) {//空树高度为0return 0;}int leftDepthmaxDepth1(root.left);//递归计算左子树高度int rightDepthmaxDepth1(root.right);//递归计算右子树高度return Math.max(leftDe…...

上海建筑建材业网招标/廊坊百度关键词优化怎么做

Vue 包含一组观察数组的变异方法&#xff0c;所以它们也将会触发视图更新。这些方法如下&#xff1a; push()pop()shift()unshift()splice()sort()reverse() 都有什么功能&#xff1f;动手试验了一下&#xff1a; <body><div id"app"><div>push方…...

wordpress加载特效/网络营销与电子商务的区别

mpi win 安装mpi Win10下Microsoft MPI&#xff08;MSMPI&#xff09;的下载安装 - 知乎 (zhihu.com) (34条消息) Dev配置MPI运行环境&#xff08;msmpi&#xff09;和OpenMP环境&#xff08;运行通过&#xff09;_devc mpi配置_一点年羊的博客-CSDN博客 #命令行运行启动多进程…...

时时彩网站开发代理代码/最新注册域名查询

android:divider"drawable/shape"<!--分割线图片-->android:showDividers"middle|beginning|end" <!--分割线位置-->分割线如果是图片那就直接使用图片就行&#xff0c;如果要使用颜色就必须使用shape来显示&#xff0c;直接使用颜色或Color是…...

长沙百度网站推广厂家/搜全网的浏览器

上篇文章介绍了 flexbox 的属性与示例&#xff0c;本文再通过几个 flex 布局的案例来体会 flex 布局的特性带来的便利和问题~格式化上下文当我们给父容器设置 flex 属性后&#xff0c;flex 容器会在容器内创建一个新的 flex 格式化上下文(formatting context)。在这上下文中 fl…...