DFS之搜索顺序——AcWing 1116. 马走日

DFS之搜索顺序

定义

DFS之搜索顺序是指在执行深度优先搜索时,遍历图或树中节点的策略。具体而言,DFS会沿着一条路径深入到底,当无法继续深入时回溯,然后选择另一条未探索的路径继续深入。搜索顺序直接影响到搜索效率和剪枝的可能性,合理的顺序可以减少搜索空间,加速找到解的过程。

运用情况

  1. 路径查找:如寻找图中的最短路径或特定路径。
  2. 图的遍历:全面探索图的所有节点,常用于判断连通性、强连通分量等。
  3. 回溯问题:如八皇后、生成括号组合等,DFS自然地支持解决方案的生成与回溯。
  4. 游戏策略:如解决迷宫问题、井字游戏的胜利条件检查等。
  5. 树的遍历:前序、中序、后序遍历等,虽然是树的特例,但也是DFS的应用。

注意事项

  1. 避免循环:通过标记已访问节点来避免重复访问,防止无限循环。
  2. 剪枝:合理安排搜索顺序,尽早排除不可能产生解的分支,减少无效计算。
  3. 栈的使用:DFS通常与栈数据结构紧密相关,需注意栈的大小限制,避免栈溢出。
  4. 记忆化:对于有重叠子问题的情形,可以使用记忆化技术存储中间结果,避免重复计算。
  5. 起始节点选择:在多源或多连通分量的场景下,需要从每个未访问的节点开始执行DFS。

解题思路

  1. 初始化:标记所有节点为未访问,设置起始节点。
  2. 选择路径:从起始节点出发,选择一个未访问的邻接节点作为下一步探索的目标。
  3. 递归/迭代深入:递归或使用栈模拟递归,深入探索选定的路径,同时标记访问过的节点。
  4. 回溯:当路径无法继续深入时,返回上一层节点,尝试探索该节点的其他未访问邻居。
  5. 结束条件:当所有可达节点都被访问过,或找到所需的解时,DFS结束。
  6. 优化:根据问题特性设计搜索顺序,比如在某些问题中按某种排序规则访问邻接点可以减少搜索空间。

AcWing 1116. 马走日

题目描述

AcWing 1116. 马走日 - AcWing

运行代码

#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10;int n, m;
bool st[N][N];
int ans;
int dx[8] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};void dfs(int x, int y, int cnt)
{if (cnt == n * m){ans ++ ;return;}st[x][y] = true;for (int i = 0; i < 8; i ++ ){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (st[a][b]) continue;dfs(a, b, cnt + 1);}st[x][y] = false;
}int main()
{int T;scanf("%d", &T);while (T -- ){int x, y;scanf("%d%d%d%d", &n, &m, &x, &y);memset(st, 0, sizeof st);ans = 0;dfs(x, y, 1);printf("%d\n", ans);}return 0;
}

代码思路

  1. 定义变量

    • n 和 m 分别代表网格的行数和列数。
    • st[N][N] 是一个布尔型数组,用来标记每个网格格子是否已被访问过。
    • ans 记录可行的方案数。
    • dx[] 和 dy[] 分别存储了马在八个可能移动方向上的横纵坐标变化值。
  2. 主函数main()

    • 首先读取测试用例数量 T
    • 然后对于每一个测试用例:
      • 读取网格大小 n 和 m,以及起始位置 xy
      • 清零状态数组 st 和答案计数器 ans
      • 调用深度优先搜索函数 dfs(),传入起始位置和初始计步数 1
      • 输出最终得到的可行方案数 ans
  3. 深度优先搜索函数dfs(int x, int y, int cnt)

    • 基线条件:如果当前已经访问了所有的n*m个格子(即 cnt == n * m),说明找到了一种合法的走法,因此答案加一,然后返回。
    • 状态标记:标记当前位置 (x, y) 为已访问。
    • 探索相邻节点:对于马可以走的八个方向,依次检查是否越界以及是否已经访问过。如果没有,则继续以当前位置为起点进行深度优先搜索,同时计步数加一。
    • 回溯:在对一个方向的探索结束后,需要将当前位置的状态重置为未访问,以便探索其他路径。

改进思路

  1. 剪枝策略位置合法性检查提前:在进入dfs递归之前,预先判断当前位置(x, y)是否可能达到目标。例如,当剩余步数(cnt)超过剩余未访问格子数时,无需继续搜索,直接返回。避免重复路径:记录并检查已访问路径,如果发现当前路径与之前的某条路径重复(可以通过记录访问顺序实现),则直接返回,避免循环搜索。

  2. 记忆化搜索:对于较大的n和m,可以采用记忆化搜索减少重复计算。使用一个三维数组dp[x][y][cnt]记录从位置(x, y)出发,已经走了cnt步时的方案数。在进行dfs之前先检查dp[x][y][cnt]是否已有计算结果,若有则直接使用,避免重复计算。

  3. 双向BFS或A*搜索

    • 当寻找特定目标或优化搜索速度时,考虑使用双向BFS或启发式搜索如A*算法。双向BFS从起点和终点同时开始搜索,当两个搜索前线相遇时即可停止,这通常能更快找到解。
    • A*算法利用启发式信息估计从当前节点到目标节点的成本,有助于在搜索过程中选择更优路径,减少不必要的探索。
  4. 并行处理:对于非常大的问题,可以考虑使用并行计算框架(如OpenMP、C++17的并行算法库等)来并行执行多个起始点的DFS或BFS,加速搜索过程。

  5. 输入输出优化:使用更快的输入输出方法(如缓冲读写)减少IO时间,尤其是在处理大量测试用例时,这能显著提升整体运行效率。

  6. 代码优化:宏观上看,可以考虑将一些常量(如方向数组的长度8)提取为常量定义,提高代码可读性和维护性。微观上,减少不必要的变量创建和销毁,优化循环和递归调用,都有助于提高程序运行效率。

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

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

相关文章

发现CPU占用过高,该如何排查解决?

1.使用top命令 查看cpu占用最多的进程 2.使用 top -H -p pid 发现有两个线程占用比较大 3.将线程id转换为16进制 使用命令 printf 0x%x\n pid 4.使用 jstack pid | grep 线程id(16进制&#xff09; -A 20 &#xff08;显示20行&#xff09; 根据代码显示进行错误排查

电脑为什么会提示丢失msvcp140.dll?怎么修复msvcp140.dll文件会靠谱点

电脑为什么会提示丢失msvcp140.dll&#xff1f;其实只要你的msvcp140.dll文件一损坏&#xff0c;然而你的电脑程序需要运用到这个msvcp140.dll文件的时候&#xff0c;就回提示你丢失了msvcp140.dll文件&#xff01;因为没有这个文件&#xff0c;你的很多程序都用不了的。今天我…

无人机对地面运动目标定位---获取目标的移动方向和速度

目录 一、引子 我们利用单目无人机通过等时间间隔拍照的形式对地面某移动目标进行定位&#xff0c;当前&#xff0c;我们已经获得了每张相片上该目标的三维坐标&#xff0c;并且知道该无人机在飞行过程中拍照的时间间隔&#xff0c;那么我们就可以通过一定的计算&#xff0c;得…

溶酶体靶向嵌合体制备方法和技术

网盘 https://pan.baidu.com/s/1dhCCryatp71j7yXTDdrrTw?pwdynr4 具有聚集诱导发光性质的比率型溶酶体pH探针及应用.pdf 内体-溶酶体转运靶向嵌合体降解剂及其制备方法与应用.pdf 可降解PDGFR-β的蛋白降解靶向嵌合体及其制备方法和应用.pdf 溶酶体膜包覆纳米颗粒的制备方法.…

剪画小程序:自媒体工具推荐:视频文案提取!

各位小伙伴&#xff0c;你们好啊&#xff01; 上周五观看《歌手 2024》第八期时&#xff0c;我再次被何炅老师幽默风趣的主持风格所折服。他的每一句话都仿佛带着魔力&#xff0c;让现场气氛热烈非凡&#xff0c;实在令人羡慕不已&#xff01; 何炅老师的口才之所以如此出色&a…

如何在 Ubuntu上搭建 LAMP

远程登录 Ubuntu系统环境 ssh (User)(IP) # 比如&#xff1a;ssh lennlouis192.168.207.128 为安全起见&#xff0c;建议你使用 root 登录 VPS 后创建一个具有 sudo 权限的帐号。 安装和配置 Apache 2 Apache Http Server 是一个开源的&#xff0c;非常流行&#xff0c;使用…

【Unity小知识】UnityEngine.UI程序集丢失的问题

问题表现 先来说一下问题的表现&#xff0c;今天在开发的时候工程突然出现了报错&#xff0c;编辑器提示UnityEngine.UI缺少程序集引用。 问题分析与解决&#xff08;一&#xff09; 既然是程序集缺失&#xff0c;我们首先查看一下工程项目是否引用了程序集。在项目引用中查找一…

从“钓”到“管”:EasyCVR一体化视频解决方案助力水域安全管理

一、背景 随着城市化进程的加快&#xff0c;越来越多的市民热衷于钓鱼活动。钓鱼活动在带来乐趣的同时&#xff0c;也伴随着一定的安全隐患。尤其是在一些危险水域&#xff0c;也经常出现垂钓者的身影&#xff0c;非法垂钓&#xff0c;这给城市管理带来了不小的阻力。传统的人…

Java传引用问题

本文将介绍 Java 中的引用传递&#xff0c;包括其定义、实现方式、通过引用修改原来指向的内容和通过引用修改当前引用的指向的区别 目录 1、引用传递的概念 2、引用传递的实现方式 3、传引用会发生的两种情况&#xff1a; 通过引用修改当前引用的指向 通过引用修改原来指…

华为OD机试2024年最新题库 JAVA C卷+D卷

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、链表5、栈6、滑动窗口7、二叉树8、并查集9、矩阵 三、算法1、基础算法① 贪心思维② 二分查…

统一视频接入平台LntonCVS视频监控平台具体功能介绍

LntonCVS视频监控平台是一款基于H5技术开发的安防视频监控解决方案&#xff0c;专为全球范围内不同品牌、协议及设备类型的监控产品设计。该平台提供了统一接入管理&#xff0c;支持标准的H5播放接口&#xff0c;使其他应用平台能够快速集成视频功能。无论开发环境、操作系统或…

Rufus 制作 Ubuntu 启动盘 | 开启便携的工作空间

唠唠闲话 最近服务器硬盘故障多&#xff0c;在修复过程中&#xff0c;学习了一些操作&#xff0c;这里做个记录。本期主要介绍 U盘启动盘的制作&#xff0c;以及持久化存储。 U 盘启动盘 镜像选择 Ubuntu 的版本命名遵循 “Adjective Animal” 的模式&#xff0c;即 “形容…

关于Wav2Lip配置实现

模型介绍 Wav2Lip是一种先进的深度学习模型&#xff0c;旨在将音频波形直接转换为面部动画&#xff0c;尤其关注于唇部动作的生成与同步。这一技术的核心在于其能够利用输入的语音信号&#xff0c;生成与之高度匹配的嘴唇动作&#xff0c;从而实现逼真的语音驱动数字人物动画效…

electron-vue自定义标题

1.在主进程background.js或者main.js中主窗口配置frame: false async function createWindow() {Menu.setApplicationMenu(null);// Create the browser window.const win new BrowserWindow({width: 1000,height: 600,resizable: false,frame: false,webPreferences: {nodeI…

VMware替换关键技术:核心业务系统中,访存密集型应用的性能优化

越来越多用户采用虚拟化、超融合以及云平台环境来承载其核心业务&#xff0c;核心业务的高并发对性能的要求尤为严格&#xff0c;在VMware替换的热潮下&#xff0c;原VMware用户也更为关注新平台在核心业务上的性能表现是否对标&#xff0c;或实现超越。深信服将通过系列解析&a…

Servlet与Servlet容器

什么是Servlet? Servlet是Java EE&#xff08;现称Jakarta EE&#xff09;中的一个组件&#xff0c;通常用于创建动态Web内容。Servlet是运行在Web服务器上的Java程序&#xff0c;它处理客户端的请求并生成响应。Servlet的核心功能是处理HTTP请求和响应。下面是一个servlet例…

视频编辑和视频剪辑有什么区别 视频编辑怎么旋转方向 会声会影视频制作教程下载 视频剪辑软件免费下载中文版 视频剪辑用哪个软件

如果你还分不清视频编辑与视频剪辑&#xff0c;请务必仔细阅读本文&#xff0c;了解二者之间的不同。本文还将重点介绍&#xff0c;旋转视频方向的三种常用方法&#xff0c;手把手地教你如何旋转视频方向。有关视频编辑和视频剪辑有什么区别&#xff0c;视频编辑怎么旋转方向的…

出海拓圈! 环保企业走出去之马来西亚水环境项目考察

中办、国办印发《关于构建现代环境治理体系的指导意见》&#xff0c;其中明确提出“鼓励企业参与绿色‘一带一路’建设&#xff0c;带动先进的环保技术、装备、产能走出去”。近年来中国积极参与全球生态环境治理&#xff0c;在环境资源综合管理、水旱灾害防御、固危废无害化处…

亿发:信息化建设or面子工程?究竟什么才是真正的信息化解决方案

在现代企业的竞争中&#xff0c;信息化建设扮演着越来越重要的角色。信息化技术不仅是企业提升管理效率、优化运营模式的利器&#xff0c;更是企业在市场竞争中脱颖而出的关键。然而&#xff0c;许多企业在推进信息化的过程中&#xff0c;往往容易陷入“面子工程”的误区。那么…

Windows 玩转大模型第二天:流式输出和角色扮演(提示词)(全部代码和详细部署流程)

Windows 玩转大模型第一天&#xff1a;大模型本地部署&#xff0c;调用大模型API可直接工程化应用&#xff08;全部代码和详细部署流程&#xff09;-CSDN博客 流式输出是指模型在生成内容时不是一次性输出全部结果&#xff0c;而是逐步、连续地生成输出。这种方式类似于人类在…