蓝桥杯刷题冲刺 | 倒计时5天

作者:指针不指南吗
专栏:蓝桥杯倒计时冲刺

🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾

文章目录

  • 1.方格迷宫
  • 2.字符串删减

1.方格迷宫

  • 题目

    链接: 4943. 方格迷宫 - AcWing题库

    给定一个 n 行 m 列的方格矩阵。

    行从上到下依次编号为 1∼n,列从左到右依次编号为 1∼m。

    第 i 行第 j 列的方格表示为 (i,j)。

    矩阵中的方格要么是空地(用 . 表示),要么是陷阱(用 # 表示)。

    初始时,你位于方格 (x1,y1),你需要前往方格 (x2,y2)。

    每次移动,你可以任选上、下、左、右四个方向之一,并沿该方向移动 1∼k 步。

    从一个方格移动至相邻方格视为一步。

    但是,你要保证在你的移动过程中不能走出矩阵,也不能进入陷阱方格。

    请你计算从方格 (x1,y1) 移动至方格 (x2,y2),所需要的最少移动次数

    保证方格 (x1,y1) 和方格 (x2,y2) 都是空地。

    方格 (x1,y1) 和方格 (x2,y2) 可能是同一个方格。

    注意:注意区分本题中移动次数与移动步数的区别。

    输入格式

    第一行包含三个整数 n,m,k 。

    接下来 n 行,每行包含 m 个字符,其中第 i 行第 j 个字符,要么是 .,表示方格 (i,j) 是空地;要么是 #,表示方格 (i,j) 是陷阱。

    最后一行包含四个整数 x1,y1,x2,y2。

    输出格式

    一个整数,表示所需要的最少移动次数

    如果无法从方格 (x1,y1) 移动至方格 (x2,y2),则输出 -1

    数据范围

    前 6 个测试点满足 1≤n,m≤10。
    所有测试点满足 1≤n,m,k≤1000,1≤x1,x2≤n,1≤y1,y2≤m。

    输入样例1:

    3 4 4
    ....
    ###.
    ....
    1 1 3 1
    

    输出样例1:

    3
    

    输入样例2:

    3 4 1
    ....
    ###.
    ....
    1 1 3 1
    

    输出样例2:

    8
    

    输入样例3:

    2 2 1
    .#
    #.
    1 1 2 2
    

    输出样例3:

    -1
    
  • 第一次 AC 5/21

    #include<bits/stdc++.h>
    using namespace std;
    
    typedef pair<int,int> PII;
    
    const int N =1010;
    
    int n,m,k;
    int d[N][N];
    char g[N][N];
    int x1,jj,x2,y2;
    int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
    
    void bfs()
    {
        memset(d,-1,sizeof d);
        
        d[x1][jj]=0;
        
        queue<PII> q;
        q.push({x1,jj});
        
        while(q.size())
        {
            auto t=q.front();
            q.pop();
            
            for(int i=0;i<4;i++)
            {
                for(int j=1;j<=k;j++)
                {
                    int x=t.first+dx[i]*j,y=t.second+dy[i]*j;  //题中是 1~k ,不是 k,开始审题没注意
                    if(d[x][y]==-1&&x>=1&&y>=1&&x<=n&&y<=m&&g[x][y]!='#')
                    {
                        d[x][y]=d[t.first][t.second]+1;
                        q.push({x,y});
                    }
                }
                
            }
        }
        cout<<d[x2][y2];
    }
    
    int main()
    {
        int n,m,k;
        cin>>n>>m>>k;
        
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>g[i][j];
                
        cin>>x1>>jj>>x2>>y2;
        
        if(x1==x2&&jj==y2)
        {
            cout<<0;
            return 0;
        }
                
        bfs();
        
        return 0;
    }
    
  • 第二次 模拟题解 样例过不了

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    typedef pair<int,int> PII;
    
    const int N =1010;
    
    int n,m,k;
    int d[N][N];
    char g[N][N];
    int x1,y1,x2,y2;
    int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
    
    int bfs()
    {
        memset(d,-1,sizeof d);
        
        d[x1][y1]=0;
        
        queue<PII> q;
        q.push({x1,y1});
        
        while(q.size())
        {
            auto t=q.front();
            q.pop();
            
            for(int i=0;i<4;i++)
            {
                for(int j=1;j<=k;j++)
                {
                    int x=t.first+dx[i]*j,y=t.second+dy[i]*j;
                    
                    if(g[x][y]=='#') break; //这个方向上已经遇到陷阱了,k++,肯定也过不去
                    
                    if(d[x][y]==-1&&x>=1&&y>=1&&x<=n&&y<=m&&g[x][y]=='.')
                    {
                        d[x][y]=d[t.first][t.second]+1;
                        q.push({x,y});
                    }
                    
                    else if(x>n||y>m||x<1||y<1) break;   //
                    else if(d[x][y]<=d[t.first][t.second]) break;
                }
                
            }
        }
        return d[x2][y2];
    }
    
    int main()
    {
        int n,m,k;
        cin>>n>>m>>k;
        
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>g[i][j];
                
        cin>>x1>>y1>>x2>>y2;
        
        if(x1==x2&&y1==y2)
        {
            cout<<0;
            return 0;
        }
                
        cout<<bfs();
        
        return 0;
    }
    

    不知道哪里错了,摸索中

  • 正确题解

    1.如果碰到陷阱立刻停止,加if (g [ x ] [ y ] == '#') break;
    2.如果越过边界立刻停止,加else if (x < 1 || x > n || y < 1 || y > m) break;
    3.为避免重复计算带来超时,加else if (d [ x ] [ y ] <= d [ t.first ] [t .second]) break;

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    typedef pair<int, int> PII;
    int n, m, k,x1,x2,y1,y2;
    
    const int N = 1010;
    
    char g[N][N];
    
    int d[N][N];
    
    int bfs()
    {
        queue<PII>q;
    
        memset(d, -1, sizeof d);
        d[x1][y1] = 0;
    
        int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
        if(x1 == x2 && y2 == y1) return 0 && puts("0");
    
        q.push({x1,y1});
    
        while(q.size())
        {
            auto t = q.front();
            q.pop();
            for(int i = 0; i < 4; i ++ )
            {
                for (int j = 1; j <= k; j ++ )
                {
                    int x = t.first + j*dx[i], y = t.second + j*dy[i];  //k表步数
                    if (g[x][y] == '#') break;
                    if(x>=1 && x <= n && y >= 1 && y <= m && g[x][y] == '.' && d[x][y] == -1)
                    {
                        d[x][y] = d[t.first][t.second] + 1;
                        q.push({x,y});
                    }
                    else if (x < 1 || x > n || y < 1 || y > m) break;
                    else if (d[x][y] <= d[t.first][t.second]) break;
                }
            }
        }
        return d[x2][y2];
    }
    
    int main()
    {
        cin >> n >> m >> k;
        for (int i = 1; i <= n; i ++ ) scanf("%s", g[i] + 1);
    
        cin >> x1 >> y1 >> x2 >> y2;
        cout << bfs() << endl;
    
        return 0;
    }
    
  • 反思

    1. 万能头不能和 y1 共存,以后使用 abcd 来代替
    2. 学会剪枝,特殊情况,使用break 来缩短时间
    3. 编号坐标注意是从 0 开始还是 1 开始

2.字符串删减

  • 题目

    链接: 3768. 字符串删减 - AcWing题库

    给定一个由 n 个小写字母构成的字符串。

    现在,需要删掉其中的一些字母,使得字符串中不存在连续三个或三个以上的 x

    请问,最少需要删掉多少个字母?

    如果字符串本来就不存在连续的三个或三个以上 x,则无需删掉任何字母。

    输入格式

    第一行包含整数 n。

    第二行包含一个长度为 n 的由小写字母构成的字符串。

    输出格式

    输出最少需要删掉的字母个数。

    数据范围

    3≤n≤100

    输入样例1:

    6
    xxxiii
    

    输出样例1:

    1
    

    输入样例2:

    5
    xxoxx
    

    输出样例2:

    0
    

    输入样例3:

    10
    xxxxxxxxxx
    

    输出样例3:

    8
    
  • 第一次 AC 0%

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=110;
    char a[N];
    
    int main()
    {
        int n;
        cin>>n;
        
        int cnt=0;
        
        for(int i=0;i<n;i++)
            cin>>a[i];
        
        int j=0;
        for(int i=0;i<n;i++)
        {
            while(a[i]=='x')
            {
                i++;
            }
            cnt+=max(0,i-j-3); //应该是 -2,因为如果 xxx,会变成 xx ,-1,手动
            j=i;  //j应该等于 i+1 才正确
        }
        
        cout<<cnt;
        
        return 0;
    }
    

    边界处理问题

  • 第二次 AC 100%

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=110;
    char a[N];
    
    int main()
    {
        int n;
        cin>>n;
        
        int cnt=0;
        
        for(int i=0;i<n;i++)
            cin>>a[i];
        
        int j=0;
        for(int i=0;i<n;i++)
        {
            while(a[i]=='x')
            {
                i++;
            }
            cnt+=max(0,i-j-2);
            j=i+1;  //这两个边界改了之后就可以了
        }
        
        cout<<cnt;
        
        return 0;
    }
    
  • 反思/复习

    双指针的一般思路就是,先想出来暴力朴素算法,然后使用双指针优化

    在实现代码过程中,边界问题是不能不当回事的,不认真思考的,看似小事,实则全盘皆输

Alt

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sam Altman专访:GPT-4没太让我惊讶,ChatGPT则让我喜出望外

导读ChatGPT、GPT-4 无疑是 2023 年年初人工智能界最大的「爆款」。3 月 26 日&#xff0c;OpenAI CEO、ChatGPT 之父 Sam Altman 接受了著名学者与科技播客、麻省理工大学研究员 Lex Fridman 的专访&#xff0c;Sam 分享了从OpenAI内部视角如何看待ChatGPT和GPT-4的里程碑式意…

分享:数据库存储与索引技术(三)LSM树实现案例

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 本文来自OceanBase社区分享&#xff0c;仅限交流探讨。原作者马伟&#xff0c;长期从事互联网广告检索系统的研发&#xff0c;对数据库&#xff0c;编译器等领域也有浓厚兴趣。 文章目录1. MemTab…

2.2.2 第2遍:程序细节

这段话主要解释了C程序中#include指令和头文件的作用。头文件包含了编译器所需的信息&#xff0c;例如函数名、常量、以及如何使用它们等。在C程序中&#xff0c;头文件通常用于包含库函数&#xff0c;例如stdio.h文件中包含了输入和输出函数&#xff08;如printf()&#xff09…

LCHub:ChatGPT4和低代码来临,程序员面临下岗?

一个网友吐槽道: “ 建站出来了,你们说程序员会失业。 低代码出来了,你们说程序员会失业。 Copilot出来了,你们说程序员会失业。 Chatgpt出来了,你们说程序员会失业 虽然这只是网友的吐槽,但却引起了小编的好奇。为何程序员那么容易被新技术取代?今天小编打算跟大家…

Waline在Butterfly主题中的应用

LeanCloud 设置 (数据库) 国内版的LeanCloud需要绑定域名&#xff0c;所以我们直接选择国外版的LeanCloud 登陆注册 注册&#xff1a;点击这里进行跳转注册成功后进入控制台&#xff0c;选择 创建应用 。 创建完成后进入应用&#xff0c;下拉找到 设置 , 会有 AppID 、AppK…

ASO优化之应用商店关键词的实现

投放正确的合适的关键词&#xff0c;能够确保我们的应用获得更高的相关性和知名度。如果我们已经完成研究并想要竞争目标关键词&#xff0c;就需要在商品详情中去实施投放它们。 要在 Google Play Store 中投放——我们要打开 Google Play 控制台并点击“主要应用详情”选项卡…

基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

VMware创建和使用虚拟网络

文章目录如何打开虚拟网络编辑器让虚拟机使用有线、无线网卡1. 点击“添加网络”2. 虚拟机使用电脑自带无线网卡3. 虚拟机使用电脑自带有线网卡重置虚拟网络在使用虚拟机的过程中&#xff0c;有时会需要让虚拟机使用物理机的网络设备直接与外部连接&#xff0c;例如让虚拟机通过…

Win11启用IE方法

呉師傅 Win11是微软目前的最新系统&#xff0c;尽管该系统非常不错&#xff0c;但是还是有很多不一样的地方&#xff0c;有的用户发现Win11没有了IE浏览器&#xff0c;那么Win11没有IE浏览器怎么办呢&#xff0c;有的旧网页需要IE浏览器才能进入&#xff0c;下面就给大家提供一…

怎么把两个音频合成一个

在创作音乐、制作视频等领域&#xff0c;经常需要将音频文件进行合并处理&#xff0c;但对于没有专业工具和知识的朋友来说&#xff0c;音频合并可能是一项复杂的任务。本篇文章就要为大家介绍合并音频的方法&#xff0c;让大家能够快速地将音频文件合并成需要的部分&#xff0…

leaflet: 地图上叠加日夜区域(126)

第126个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中显示日夜交替叠加区域。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共68行)安装插件相关API参考:专栏目标示例效果 配置方式 1)查看基础设…

ChatGPT能胜任高级程序员吗?

与开发人员信任的其他软件开发工具不同&#xff0c;AI工具在训练、构建、托管和使用方式等方面都存在一些独特的风险。 自2022年底ChatGPT发布以来&#xff0c;互联网上便充斥着对其几乎相同比例的支持和怀疑的论调。不管你是否喜欢它&#xff0c;AI正在逐步进入你的开发组织。…

【设计模式】Bridge Design pattern 桥接模式

1.桥接模式要解决的问题 多个维度的变化引起的继承组合指数级增长 例子 一个物体有不同形状和不同颜色&#xff0c;如何用类来表示它们&#xff0c;这里包含了两个变化维度&#xff0c;一个是物体的形状&#xff0c;一个是颜色 继承的方式 如果使用继承的方式&#xff0c;此…

抖音seo优化系统常见的交付形式|技术开发

1. 一次性交付&#xff1a;将整个SEO优化系统一次性交付给客户&#xff0c;包括相关的文档、工具和数据分析报告&#xff0c;由客户自行操作和维护。 2. 阶段性交付&#xff1a;将SEO优化系统分为不同的阶段进行交付&#xff0c;每个阶段完成后进行检查和评估&#xff0c;根据…

2. [手把手教你搭建] 之 在linux上搭建mysql

1. 首先下载mysql安装包&#xff0c;这里一般有如下2种下载方式 wgt方式下载&#xff1a;进入服务器中的package目录&#xff08;注&#xff1a;该目录是我自己创建的&#xff0c;用于存放所有应用的安装包&#xff0c;您也可以随便创建其他名称的目录来存放安装包&#xff09…

k8s部署

kubernetes简要 Kubernetes 是用于自动部署, 扩展和管理容器化应用程序的开源系统. 它将组成应用程序的容器组合成逻辑单元, 以便于管理和服务发现 kubernetes功能简介 服务发现和负载均衡 存储编排 自动部署和回滚 自动完成装箱计算 自我修复 密钥与配置管理 Kuberne…

算法题记录

力扣的算法题&#xff1a;1154 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&#xff1a; 输入&#xff1a;date “2019-01-09” 输出&#xff1a;9 解释&#xff1a;给定日期是2019年的第九天。 示例…

【数据结构与算法】查找(Search)【详解】

文章目录查找查找概论一、查找的基本概念顺序表查找一、定义二、算法有序表查找一、折半查找二、插值查找三、斐波那契查找线性索引查找一、稠密索引二、分块索引三、倒排索引二叉树排序与平衡二叉树一、二叉排序树1、定义2、二叉排序树的常见操作3、性能分析二、平衡二叉树1、…

【学习笔记】启示录 - 打造用户喜爱的产品(阅读摘录)

【学习笔记】启示录 - 打造用户喜爱的产品&#xff08;阅读摘录&#xff09; 图书信息 Marty Cagan 著 七印部落 译 人员&#xff1a; 负责定义和开发产品的团队成员的角色和职责 流程&#xff1a; 探索、开发富有创意的产品时&#xff0c;反复应用的步骤和成功的实践经验 产品…

Ethernet-APL——网络拓扑结构

| 三种独立的应用场景——适用于短距离小型网络和长距离大型网络&#xff01; Ethernet-APL&#xff08;Advanced Physical Layer&#xff0c;高级物理层&#xff09;是过程工业的新标准。它基于IEEE 802.3cg的10BASE-T1L规范&#xff0c;并通过使用两线制以太网来连接到现场设…