蓝桥杯 之 暴力回溯

文章目录

  • 数字接龙
  • 小u的最大连续移动次数问题
  • 迷宫

  • 在蓝桥杯中,十分喜欢考察对于网格的回溯的问题,对于这类的问题,常常会使用到这个DFSBFS进行考察,不过无论怎么考察,都只是会在最基础的模本的基础上,根据这个题目的条件:
    • 增加递归传递的参数
    • 增加条件转移的时候的条件的判断
    • 考察对于终止状态的设置,答案的存储与更新

数字接龙

数字接龙

在这里插入图片描述
在这里插入图片描述

  • 查看数据范围,适合直接进行暴露的DFS搜索
  • 题目的条件有点多,我们逐一进行分析:
    • 需要记录哪些信息?
      • 当前位置的数字,当前的坐标,当前访问过的方格的数目
      • 为了保证每一个格子只能访问过一次,所以得使用visited数组
      • 移动的方向的,得使用一个二维数组step来记录,得逐一步伐的顺序与对应的方位顺序是一致的
      • 对于答案的记录,考虑使用这个字符来记录,最后再合并就好了
      • 对于交叉的判断的综合考虑?

代码版本1,不考虑这个交叉的问题

import os
import sys# sys.setrecursionlimit(10 ** 6)
# 请在此输入您的代码N,K = map(int,input().split())
e = []
# 存储图
for _ in range(N):tmp = list(map(int,input().split()))e.append(tmp)# 状态转移的路径,左,右,上,下,左上角,右上角,左下角,右下角
# 转移还得按照这个顺序
#step = [[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[-1,1],[1,-1],[1,1]]
step = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]ans = []
path = []visited = [[False]*N for _ in range(N)]# 开始深度搜索,每一步的时候,判断下面是否是0,还是i+1,还得判断是否都走过了每一个位置
def dfs(i,x,y,cursum):# 终止状态if x == N-1 and y == N-1 and cursum == N*N:ans.append(int(''.join(path)))# 如何转移?for j in range(8):nx,ny = x+step[j][0],y+step[j][1]if 0<= nx < N and 0<= ny < N and not visited[nx][ny] and (e[nx][ny] == 0 or e[nx][ny] == i + 1):# 还是得存储这个字符形式visited[nx][ny] = Truepath.append(str(j))dfs(e[nx][ny],nx,ny,cursum+1)path.pop()visited[nx][ny] = Falsevisited[0][0] = True
dfs(e[0][0],0,0,1)
if ans:print(min(ans))
else:print(-1)
  • 测试样例的通过的情况:

在这里插入图片描述
在这里插入图片描述

增加了对于交叉的判断


import os
import sys# sys.setrecursionlimit(10 ** 6)
# 请在此输入您的代码N,K = map(int,input().split())
e = []
# 存储图
for _ in range(N):tmp = list(map(int,input().split()))e.append(tmp)# 状态转移的路径,左,右,上,下,左上角,右上角,左下角,右下角
# 转移还得按照这个顺序
#step = [[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[-1,1],[1,-1],[1,1]]
step = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]ans = []
path = []visited = [[False]*N for _ in range(N)]# 开始深度搜索,每一步的时候,判断下面是否是0,还是i+1,还得判断是否都走过了每一个位置
def dfs(i,x,y,cursum):# 终止状态if x == N-1 and y == N-1 and cursum == N*N:ans.append(int(''.join(path)))# 如何转移?for j in range(8):nx,ny = x+step[j][0],y+step[j][1]if 0<= nx < N and 0<= ny < N and not visited[nx][ny] and (e[nx][ny] == 0 or e[nx][ny] == i + 1):if j == 1 and 0<= x-1 and y+1 < N:if visited[x][y+1] and visited[x-1][y]:continueif j == 3 and x+1 < N and y+1 < N:if visited[x][y+1] and visited[x+1][y]:continueif j == 5 and x+1 < N and 0<= y-1:if visited[x][y-1] and visited[x+1][y]:continueif j == 7 and 0<= y-1 and 0<= x-1:if visited[x][y-1] and visited[x-1][y]:continue# 还是得存储这个字符形式visited[nx][ny] = Truepath.append(str(j))dfs(e[nx][ny],nx,ny,cursum+1)path.pop()visited[nx][ny] = Falsevisited[0][0] = True
dfs(e[0][0],0,0,1)
if ans:print(min(ans))
else:print(-1)
  • 样例通过情况

在这里插入图片描述
在这里插入图片描述

  • 改进这个交叉判断,上面的判断其实是不合理的,因为如果左右两边的位置都被访问过的话,并不确定对应的对角线是存在线的,正确的做法就是使用多一个数组记录当前位置的下一步是什么,如果左右位置存在对角线,那么就不能通过

import os
import sys# sys.setrecursionlimit(10 ** 6)
# 请在此输入您的代码N,K = map(int,input().split())
e = []
# 存储图
for _ in range(N):tmp = list(map(int,input().split()))e.append(tmp)# 状态转移的路径,左,右,上,下,左上角,右上角,左下角,右下角
# 转移还得按照这个顺序
#step = [[0,-1],[0,1],[-1,0],[1,0],[-1,-1],[-1,1],[1,-1],[1,1]]
step = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]]ans = []
path = []visited = [[False]*N for _ in range(N)]
nextstep = [[-1]*N for _ in range(N)]# 开始深度搜索,每一步的时候,判断下面是否是0,还是i+1,还得判断是否都走过了每一个位置
def dfs(i,x,y,cursum):# 终止状态if x == N-1 and y == N-1 and cursum == N*N:if not ans:ans.append(int(''.join(path)))return # 如何转移?for j in range(8):nx,ny = x+step[j][0],y+step[j][1]if 0<= nx < N and 0<= ny < N and not visited[nx][ny] and (e[nx][ny] == 0 or e[nx][ny] == i + 1):if j == 1 and (nextstep[nx][ny-1] == 3 or nextstep[nx-1][ny] == 7): continueif j == 3 and (nextstep[nx-1][ny] == 5 or nextstep[nx][ny-1] == 1): continueif j == 5 and (nextstep[nx-1][ny] == 3 or nextstep[nx][ny+1] == 7): continueif j == 7 and (nextstep[nx+1][ny] == 1 or nextstep[nx][ny+1] == 5): continuenextstep[x][y] = j# 还是得存储这个字符形式visited[nx][ny] = Truepath.append(str(j))dfs(e[nx][ny],nx,ny,cursum+1)if ans:return path.pop()visited[nx][ny] = Falsenextstep[x][y] = -1visited[0][0] = True
dfs(e[0][0],0,0,1)
if ans:print(min(ans))
else:print(-1)

小u的最大连续移动次数问题

小u的最大连续移动次数问题

在这里插入图片描述

  • 直接暴力进行求解
  • 这个问题的难点在于这个没有明确的终止状态,所以考虑使用一个全局的变量进行动态的更新,直接都不返回值
  • 需要记录的信息:
    • 当前的位置x,y,当前的步数step,上一个状态是上坡还是下坡flag
def solution(m: int, n: int, a: list) -> int:# 先写一个dfs模版,后面再每一个点都进行调用sstep = [[0,-1],[0,1],[-1,0],[1,0]]visited = [[False]*n for _ in range(m)]ans = 0# 还得增加一个变量记录上次是上坡还是下坡,flag = 1表示上,-1表示下def dfs(x,y,step,flag):nonlocal ansans = max(ans,step)for s in sstep:nx,ny = x+s[0],y+s[1]if 0<= nx < m and 0<= ny < n and not visited[nx][ny]:if flag == -1 and a[nx][ny] > a[x][y]:visited[nx][ny] = Truedfs(nx,ny,step+1,1)visited[nx][ny] = Falseif flag == 1 and a[nx][ny] < a[x][y]:visited[nx][ny] = Truedfs(nx,ny,step+1,-1)visited[nx][ny] = Falseans = 0for i in range(m):for j in range(n):visited[i][j] = Truedfs(i,j,0,1)dfs(i,j,0,-1)visited[i][j] = Falsereturn ans

迷宫

迷宫

在这里插入图片描述

在这里插入图片描述

  • 求解的是最短距离的问题,所以首先得想到使用这个BFS进行求解
  • 由于求解的是随机起点到终点的距离,所以我们直接逆向思考,直接从终点进行遍历,当栈为空的时候,就说明已经遍历完全部的位置了

from collections import deque, defaultdictn, m = map(int, input().split())
change = defaultdict(list)
for _ in range(m):x1, y1, x2, y2 = map(int, input().split())x1, y1, x2, y2 = x1 - 1, y1 - 1, x2 - 1, y2 - 1change[(x1, y1)].append((x2, y2))change[(x2, y2)].append((x1, y1))def bfs(start, end):queue = deque([(start, end)])visited = [[-1] * n for _ in range(n)]  # 使用二维数组记录步数,初始值为 -1visited[start][end] = 0step = [[0, -1], [0, 1], [-1, 0], [1, 0]]while queue:s, e = queue.popleft()# 访问邻居for dx, dy in step:nx, ny = s + dx, e + dyif 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == -1:visited[nx][ny] = visited[s][e] + 1queue.append((nx, ny))# 走传送门if (s, e) in change:for nx, ny in change[(s, e)]:if visited[nx][ny] == -1:visited[nx][ny] = visited[s][e] + 1queue.append((nx, ny))# 计算平均步数total = 0for x in range(n):for y in range(n):total += visited[x][y]return total / (n * n)print(f"{bfs(n - 1, n - 1):.2f}")

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

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

相关文章

微信小程序的业务域名配置(通过ingress网关的注解)

一、背景 微信小程序的业务域名配置&#xff08;通过kong网关的pre-function配置&#xff09;是依靠kong实现&#xff0c;本文将通过ingress网关实现。 而我们的服务是部署于阿里云K8S容器&#xff0c;当然内核与ingress无异。 找到k8s–>网络–>路由 二、ingress注解 …

Python数据可视化工具:六西格玛及其基础工具概览

在当今数据驱动的时代&#xff0c;数据分析和可视化工具成为了各行业优化流程、提升质量的关键手段。六西格玛&#xff08;Six Sigma&#xff09;作为一种以数据为基础、追求完美质量的管理理念&#xff0c;其实施依赖于一系列基础工具的灵活运用。而Python&#xff0c;凭借其强…

集群环境下Redis 商品库存系统设计

目录 环境实现基本结构代码业务代码主体库存管理模块 后续问题高并发临界值与乐观锁问题 完整代码总结后话 环境 我们现在要做商品秒杀系统。功能很简单&#xff0c;就是库存删减。用户先下单减库存&#xff0c;之后再进行扣款。 实现 基本结构代码 那么我们先看下如何搭建…

Spring MVC响应数据

handler方法分析 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为handler* TODO: handler需要使用RequestMapping/GetMapping系列,声明路径,在HandlerMapping中注册,供DS查找!* TODO: handler作用总结:* 1.接收请求参数(param,json,pathVariable,共享域等…

基于图像识别的医学影像大数据诊断系统的设计与实现

标题:基于图像识别的医学影像大数据诊断系统的设计与实现 内容:1.摘要 随着医学影像技术的快速发展&#xff0c;医学影像数据量呈爆炸式增长&#xff0c;传统的人工诊断方式在处理海量数据时效率低下且容易出现误差。本研究的目的是设计并实现一个基于图像识别的医学影像大数据…

Python散点图(Scatter Plot):数据探索的“第一张图表”

在数据可视化领域,散点图是一种强大而灵活的工具,它能够帮助我们直观地理解和探索数据集中变量之间的关系。本文将深入探讨散点图的核心原理、应用场景以及如何使用Python进行高效绘制。 后续几篇将介绍高级技巧、复杂应用场景。 Python散点图(Scatter Plot):高阶分析、散点…

【redis】在 Spring中操作 Redis

文章目录 基础设置依赖StringRedisTemplate库的封装 运行StringList删库 SetHashZset 基础设置 依赖 需要选择这个依赖 StringRedisTemplate // 后续 redis 测试的各种方法&#xff0c;都通过这个 Controller 提供的 http 接口来触发 RestController public class MyC…

微服务》》Kubernetes (K8S) 集群 安装

关闭交换空间 # 切换 超级管理员身份 # 查看交换空间 free -h # 关闭交换空间 swapoff -a避免开启启动交换空间 # 注释swap开头的行 vim /etc/fstab关闭防火墙 # 关闭防火墙 # 因为K8S 是集群形式存在的 至少三台 一主二从 &#xff08;一个master 两个node&#xff09…

HTTP和RPC的区别

RPC和 HTTP是两种常见的通信方式&#xff0c;它们在设计目标、使用场景和技术实现上有显著区别。以下是它们的详细对比&#xff1a; 1. 定义与核心思想 特性RPCHTTPRemote Procedure Call远程过程调用HyperText Transfer Protocol超文本传输协议定义一种协议或框架&#xff0…

MySQL 简记

MySQL 简记 mysql中的数据存储的结构是B树 其与B树的相同点是&#xff0c;B树一个节点也可以存放多条数据&#xff0c;并且从左到右依次增大&#xff1b;不同点是&#xff0c;B树的叶子结点之间也能相互连接。那么实际上是采取利用空间换区时间的策略。 那么B树的树结构like…

十七、实战开发 uni-app x 项目(仿京东)- 后端指南

前面我们已经用uniappx进行了前端实战学习 一、实战 开发uni-app x项目(仿京东)-规划-CSDN博客 二、实战 开发uni-app x项目(仿京东)-项目搭建-CSDN博客 三、实战开发 uni-app x 项目(仿京东)- 技术选型-CSDN博客 四、实战开发 uni-app x 项目(仿京东)- 页面设计-C…

Infura 简介

文章目录 Infura 简介Infura 的主要功能Infura 的替代方案&#xff08;类似服务&#xff09;AlchemyQuickNodeAnkrMoralisPocket Network 什么时候选择 Infura&#xff1f; Infura 简介 Infura 是一个 区块链基础设施即服务&#xff08;BaaS, Blockchain as a Service&#xf…

TouchSocket TcpService:构建高性能Tcp服务的终极利器

这里写目录标题 TouchSocket TCPService&#xff1a;构建高性能TCP服务的终极利器引言TCPService核心特性快速入门&#xff1a;5分钟搭建TCP服务1. 创建基础TCP服务2. 自定义插件处理数据 高级用法实战1. 客户端连接管理 性能与稳定性保障示例与源码结语 TouchSocket TCPServic…

Android Fresco 框架缓存模块源码深度剖析(二)

一、引言 在 Android 应用开发中&#xff0c;图片加载和处理是常见且重要的功能。频繁的图片加载不仅会消耗大量的网络流量&#xff0c;还会影响应用的性能和响应速度。因此&#xff0c;有效的缓存机制对于提升图片加载效率和用户体验至关重要。Fresco 是 Facebook 开源的一款…

springboot使用163发送自定义html格式的邮件

springboot使用163发送html格式的邮件 效果: 下面直接开始教学 注册邮箱&#xff0c;生成授权码 获取163邮箱的授权码&#xff0c;可以按照以下步骤操作&#xff1a; 登录163邮箱 打开浏览器&#xff0c;访问 163邮箱登录页面。 使用你的邮箱账号和密码登录。进入邮箱设置 登…

【Kafka】深入了解Kafka

集群的成员关系 Kafka使用Zookeeper维护集群的成员信息。 每一个broker都有一个唯一的标识&#xff0c;这个标识可以在配置文件中指定&#xff0c;也可以自动生成。当broker在启动时通过创建Zookeeper的临时节点把自己的ID注册到Zookeeper中。broker、控制器和其他一些动态系…

C#使用SnsPictureBox.dll绘制点,线段、圆、折线、多边形、测量尺等多种图形。

CSDN下载地址&#xff1a;https://download.csdn.net/download/sns1991sns/87726867 gitee下载地址:https://gitee.com/linsns/SnsPictrueBox 支持2种绘制方式&#xff1a;响应式和等待式。 一、使用响应式绘制图形 1、在窗口构造函数里添加绘制图形的完成响应函数 public…

Hugging Face预训练GPT微调ChatGPT(微调入门!新手友好!)

Hugging Face预训练GPT微调ChatGPT&#xff08;微调入门&#xff01;新手友好&#xff01;&#xff09; 在实战中&#xff0c;⼤多数情况下都不需要从0开始训练模型&#xff0c;⽽是使⽤“⼤⼚”或者其他研究者开源的已经训练好的⼤模型。 在各种⼤模型开源库中&#xff0c;最…

Redis BitMap 用户签到

Redis Bitmap Bitmap&#xff08;位图&#xff09;是 Redis 提供的一种用于处理二进制位&#xff08;bit&#xff09;的特殊数据结构&#xff0c;它基于 String 类型&#xff0c;每个 bit 代表一个布尔值&#xff08;0 或 1&#xff09;&#xff0c;可以用于存储大规模的二值状…

Spring Boot 3 新特性实战:从理论到实践

引言 Spring Boot 自发布以来&#xff0c;凭借其简洁的配置和强大的功能&#xff0c;迅速成为 Java 开发者的首选框架。随着 Spring Boot 3 的发布&#xff0c;开发者们迎来了更多令人兴奋的新特性。本文将深入探讨 Spring Boot 3 的新特性&#xff0c;并通过实战示例展示如何…