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

蓝桥杯例题一

不管遇到多大的困难,我们都要坚持下去。每一次挫折都是我们成长的机会,每一次失败都是我们前进的动力。路漫漫其修远兮,吾将上下而求索。只有不断努力奋斗,才能追逐到自己的梦想。不要害怕失败,害怕的是不敢去尝试。只有敢于面对挑战,才能收获成功的喜悦。我们要相信自己的能力,坚信自己可以做到。生活可以很艰难,但我们要有勇气去面对,有决心去战胜它。相信自己,努力拼搏,我们一定能够创造属于自己的辉煌!

蓝桥杯官网https://dasai.lanqiao.cn/

刷题https://leetcode.cn/

目录

题目1:迷宫最短路径问题

题目2:最长公共子序列(LCS)

解答过程和代码

题目1:迷宫最短路径问题

解答过程:

Python代码实现:

题目2:最长公共子序列(LCS)

解答过程:

Python代码实现:


蓝桥杯全国软件和信息技术专业人才大赛是中国知名的编程竞赛之一,B组通常面向本科二年级及以下的学生。为了提供两个有意义且重要的题目,我会根据历年的比赛特点以及考察的重点技能来设计。以下是两个具有代表性的题目示例:

题目1:迷宫最短路径问题

背景描述: 在一个由方格组成的矩形迷宫中,每个方格可能是空地(用0表示)或墙壁(用1表示)。给定一个起点和一个终点,要求找到从起点到终点的最短路径,并输出该路径的长度。如果不存在这样的路径,则输出-1。

输入格式: 第一行包含两个整数m和n (1 <= m, n <= 100),分别表示迷宫的行数和列数。 接下来m行,每行包含n个字符,组成迷宫的地图,其中S表示起点,E表示终点,0表示空地,1表示墙壁。 保证地图中只有一个起点和一个终点。

输出格式: 输出一个整数,表示从起点到终点的最短路径长度。如果不存在这样的路径,则输出-1。

样例输入:

5 5
S0101
01010
00000
10110
1000E

样例输出:

8

解题思路: 这个问题可以使用广度优先搜索算法(BFS)来解决。BFS是一种适合用于寻找最短路径的图遍历算法。具体步骤如下:

  1. 将起点加入队列,并标记为已访问。
  2. 每次从队列中取出一个节点,检查其四个方向上的邻居节点是否是终点、空地且未被访问过。如果是,则将这些节点加入队列并标记为已访问,同时记录步数。
  3. 如果在某一步找到了终点,则返回当前步数;否则继续遍历直到队列为空。
  4. 如果遍历结束仍未找到终点,则说明没有路径可达,返回-1。

难度: 中等

知识点: 图论、广度优先搜索(BFS)、队列操作


题目2:最长公共子序列(LCS)

背景描述: 给定两个字符串s1和s2,求它们的最长公共子序列(Longest Common Subsequence, LCS)。子序列是指可以从原序列中删除若干元素而不改变剩余元素顺序得到的新序列。注意,这里的“公共”意味着这个子序列同时出现在两个字符串中。

输入格式: 第一行包含一个字符串s1。 第二行包含一个字符串s2。 字符串仅包含小写字母,长度不超过1000。

输出格式: 输出一个整数,表示最长公共子序列的长度。

样例输入:

abcde
ace

样例输出:

3

解题思路: 这个问题可以通过动态规划(Dynamic Programming, DP)来高效解决。我们定义一个二维数组dp[i][j],表示s1前i个字符与s2前j个字符之间的最长公共子序列长度。状态转移方程如下:

  • 如果s1[i] == s2[j],那么dp[i][j] = dp[i-1][j-1] + 1;
  • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])。

最终答案就是dp[len(s1)][len(s2)],其中len()函数返回字符串的长度。

难度: 中等偏难

知识点: 动态规划(DP)、字符串处理

这两个题目不仅涵盖了基本的数据结构和算法知识,而且对于培养学生的逻辑思维能力和解决问题的能力也非常有帮助。

解答过程和代码

题目1:迷宫最短路径问题

解答过程:

广度优先搜索(BFS)算法 是解决此类问题的最佳选择,因为它可以保证找到从起点到终点的最短路径。我们使用队列来存储待访问的节点,并且记录每个节点到达时的距离。

步骤:

  1. 初始化:
    • 创建一个二维数组 visited 来标记哪些位置已经被访问。
    • 初始化队列,将起点加入队列,并设置其距离为0。
  2. 遍历:
    • 从队列中取出一个节点,检查它是否是终点。
    • 如果不是终点,则检查它的四个方向(上、下、左、右),对于每个方向:
      • 如果新位置在迷宫范围内且未被访问过,并且是空地(0 或 E),则将其加入队列,并标记为已访问,同时更新距离。
  3. 结束条件:
    • 如果在某一步找到了终点,则返回当前步数。
    • 如果遍历结束仍未找到终点,则返回-1表示没有路径可达。
Python代码实现:
from collections import deque

def shortest_path(maze):
    m, n = len(maze), len(maze[0])
    directions = [(-1, 0), (1, 0), (0, -1), (0, 1)]  # 上下左右四个方向
    
    # 找到起点和终点的位置
    start, end = None, None
    for i in range(m):
        for j in range(n):
            if maze[i][j] == 'S':
                start = (i, j)
            elif maze[i][j] == 'E':
                end = (i, j)
    
    if not start or not end:
        return -1
    
    # BFS
    queue = deque([(start[0], start[1], 0)])  # (x, y, distance)
    visited = set()
    visited.add(start)
    
    while queue:
        x, y, dist = queue.popleft()
        
        if (x, y) == end:
            return dist
        
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            
            if 0 <= nx < m and 0 <= ny < n and (nx, ny) not in visited and maze[nx][ny] in ('0', 'E'):
                queue.append((nx, ny, dist + 1))
                visited.add((nx, ny))
    
    return -1

# 示例输入
maze_input = [
    "S0101",
    "01010",
    "00000",
    "10110",
    "1000E"
]

# 将输入转换成列表形式
maze = [list(row) for row in maze_input]

# 调用函数并打印结果
print(shortest_path(maze))  # 输出: 8

题目2:最长公共子序列(LCS)

解答过程:

动态规划(DP)算法 是求解最长公共子序列问题的有效方法。通过构建一个二维表 dp,其中 dp[i][j] 表示字符串 s1 的前 i 个字符与 s2 的前 j 个字符之间的最长公共子序列长度。

状态转移方程:

  • 如果 s1[i-1] == s2[j-1],那么 dp[i][j] = dp[i-1][j-1] + 1
  • 否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1])

最终答案就是 dp[len(s1)][len(s2)]

Python代码实现:
def longest_common_subsequence(s1, s2):
    m, n = len(s1), len(s2)
    # 创建dp表格,额外一行一列用于处理边界情况
    dp = [[0] * (n + 1) for _ in range(m + 1)]
    
    # 填充dp表格
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            if s1[i - 1] == s2[j - 1]:
                dp[i][j] = dp[i - 1][j - 1] + 1
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
    
    return dp[m][n]

# 示例输入
s1 = "abcde"
s2 = "ace"

# 调用函数并打印结果
print(longest_common_subsequence(s1, s2))  # 输出: 3

这两个题目不仅涵盖了基本的数据结构和算法知识,而且对于培养学生的逻辑思维能力和解决问题的能力也非常有帮助。


http://www.kler.cn/a/515914.html

相关文章:

  • 从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
  • 【深度学习】1.深度学习解决问题与应用领域
  • USART_串口通讯轮询案例(HAL库实现)
  • 2025.1.20——二、buuctf BUU UPLOAD COURSE 1 1 文件上传
  • 攻防世界GFSJ1012 pwnstack
  • OpenVela 各模块之间的交互方式和数据流
  • 使用 Element-UI 中的 el-button 添加防抖指令防止重复提交
  • 备赛蓝桥杯之第十五届职业院校组省赛第三题:产品360度展示
  • Alibaba Spring Cloud 四 Seata 的核心组件:TC
  • 【浙江省乡镇界】面图层shp格式arcgis数据+乡镇名称和编码+wgs84坐标无偏移内容测评
  • 在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持
  • 【C++图论 并集查找】2492. 两个城市间路径的最小分数|1679
  • TOGAF之架构标准规范-信息系统架构 | 数据架构
  • 小利特惠源码/生活缴费/电话费/油卡燃气/等充值业务类源码附带承兑系统
  • c语言贪吃蛇(极简版,基本能玩)
  • 【豆包MarsCode蛇年编程大作战】花样贪吃蛇
  • 操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之缓冲区的管理
  • 百度APP iOS端磁盘优化实践(上)
  • 深入理解Spring Boot:启动方式、注解、配置文件与模板引擎
  • 深度理解递归(树的深度优先遍历、费波那契数列)c++
  • Effective C++ 规则43:学习处理模板化基类内的名称
  • linux+docker+nacos+mysql部署
  • 认识Django项目模版文件——Django学习日志(二)
  • Spring Boot整合Thymeleaf、JDBC Template与MyBatis配置详解
  • 【C语言】编译链接
  • 软考信安26~大数据安全需求分析与安全保护工程