数据结构学习 12字母迷宫

dfs 回溯 剪枝

这个题和dfs有关,但是我之前没有接触过,我看了这一篇很好的文章,看完之后写的答案。

我觉得很好的总结:

dfs模板


int check(参数)
{if(满足条件)return 1;return 0;
}void dfs(int step)
{判断边界{相应操作}尝试每一种可能{满足check条件标记继续下一步dfs(step+1)恢复初始状态(回溯的时候要用到)}
} 

尝试每一种可能,一般都是用for循环。

在一些情况下,for循环这一步可以写到外面去,然后再调用dfs,比如这题就可以。 


题目:


我的思路:

其实就是模仿我刚刚提到的文章。

 我的dfs是:bool dfs(std::vector<std::vector<char>>& grid, std::string target, int step, int pre_i, int pre_j)

是拿上一步的pre_i和pre_j作为输入,然后我发现这样写没办法启动dfs,但是我当时脑子抽了,没找到直接输入i和j就能做出来的办法。所以只能第一步遍历所有格子的时候,把它写在dfs外面,总之有点愚蠢。但是,执行时间和内存都比我下一种写法要少很多,这是为啥?

(我自己写的)

复杂度:

代码:

#include <vector>
#include <string>
#include <iostream>
//我写的 dfs 剪枝 回溯
class Solution {
public:Solution(){}bool wordPuzzle(std::vector<std::vector<char>>& grid, std::string target) {n = target.size();if (n == 0 || grid.empty() || grid[0].empty())return false;rows = grid.size();//行cols = grid[0].size();//列int step = 1;vis = std::vector<int>(rows * cols);res = std::vector<char>(n);for (int i = 0; i < rows; ++i)//因为我写的dfs需要接受前一个dfs的位置i,j,为了启动,只能把第一轮遍历写在外面了{for (int j = 0; j < cols; ++j){if (grid[i][j] == target[step - 1]){res[step - 1] = grid[i][j];//访问vis[i * cols + j] = 1;//标记result = dfs(grid, target, step + 1, i, j);if (result)return result;vis[i * cols + j] = 0;//回溯res[step - 1] = '\0';//回溯}}}return result;}
private:bool dfs(std::vector<std::vector<char>>& grid, std::string target, int step, int pre_i, int pre_j){if (step == n + 1)return true;//中止条件 判断边界for (int i = 0; i < rows; ++i)//尝试每一种可能{for (int j = 0; j < cols; ++j){if (vis[i * cols + j] == 0 &&//走过的不要grid[i][j] == target[step-1]&&//不相同的直接不要((i * cols + j) == (pre_i * cols + pre_j - cols) ||//上(i * cols + j) == (pre_i * cols + pre_j + cols) ||//下(i == pre_i && j == pre_j - 1) ||//左(i == pre_i && j == pre_j + 1)))//右{res[step-1] = grid[i][j];//访问vis[i * cols + j] = 1;//标记result = dfs(grid, target, step + 1, i, j);//下一个if (result)return result;vis[i * cols + j] = 0;//回溯res[step - 1] = '\0';//回溯}}}return result;}int n = 0;int rows = 0;int cols = 0;std::vector<int> vis;std::vector<char> res;bool result = false;
};void Test_solution1()
{Solution solution;std::vector<std::vector<char>> grid{ { 'C','A','A'} ,{'A','A','A'},{'B','C','D'} };std::cout<< solution.wordPuzzle(grid ,std::string("AAB"));}

答案思路:

 把循环写到dfs外面了。

dfs判断的是当前的点。所以dfs是:

dfs(std::vector<std::vector<char>>& grid, std::string target, int step, int i, int j),

这里传进来的i和j是需要被判断的点,而不是我写的pre_i和pre_j

找方向用的是:

            result = dfs(grid, target, step + 1, i - 1, j) ||
                dfs(grid, target, step + 1, i + 1, j) ||
                dfs(grid, target, step + 1, i, j - 1) ||
                dfs(grid, target, step + 1, i, j + 1);

比我的好多了,呵呵。

但是测试的时间和内存异常多。然后我又测试了答案提供的,还是很多时间和内存,很奇怪啊。

 

看了答案之后自己根据思路重新写了一遍代码:

#include <vector>
#include <string>
#include <iostream>
//看了答案之后模仿写的 dfs 剪枝 回溯
//这个要用很多内存 呃,为什么?
class Solution {
public:Solution() {}bool wordPuzzle(std::vector<std::vector<char>>& grid, std::string target) {n = target.size();if (n == 0 || grid.empty() || grid[0].empty())return false;rows = grid.size();//行cols = grid[0].size();//列int step = 1;vis = std::vector<int>(rows * cols);//res = std::vector<char>(n);for (int i = 0; i < rows; ++i)//循环写在外面了{for (int j = 0; j < cols; ++j){result = dfs(grid, target, step, i, j);if (result)return result;}}return result;}
private:bool dfs(std::vector<std::vector<char>>& grid, std::string target, int step, int i, int j){if (step == n + 1)return true;//中止条件if (i >= 0 && i < rows && j >= 0 && j < cols &&//超过的不要vis[i * cols + j] == 0 &&//走过的不要grid[i][j] == target[step - 1])//不相同的直接不要{//res[step - 1] = grid[i][j];//访问vis[i * cols + j] = 1;//标记result = dfs(grid, target, step + 1, i - 1, j) ||dfs(grid, target, step + 1, i + 1, j) ||dfs(grid, target, step + 1, i, j - 1) ||dfs(grid, target, step + 1, i, j + 1);if (result)return result;vis[i * cols + j] = 0;//res[step - 1] = '\0';}return result;}int n = 0;int rows = 0;int cols = 0;std::vector<int> vis;//std::vector<char> res;bool result = false;
};void Test_solution2()
{Solution solution;std::vector<std::vector<char>> grid{ { 'C','A','A'} ,{'A','A','A'},{'B','C','D'} };std::cout << solution.wordPuzzle(grid, std::string("AAB"));}

测试结果:

 

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

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

相关文章

【JUC】二十九、synchronized锁升级之轻量锁与重量锁

文章目录 1、轻量锁2、轻量锁的作用3、轻量锁的加锁和释放4、轻量级锁的代码演示5、重量级锁6、重量级锁的原理7、锁升级和hashcode的关系8、锁升级和hashcode关系的代码证明9、synchronized锁升级的总结10、JIT编译器对锁的优化&#xff1a;锁消除和锁粗化11、结语 &#x1f4…

基士得耶速印机印件故障解决方法和印刷机使用注意事项

基士得耶和理光两个品牌的一体化速印机同属于理光公司的两个不同品牌。基士得耶速印机的每个机型&#xff0c;都有和它通用的理光速印机的机型相对应。&#xff08;油墨版纸通用&#xff0c;外观一样&#xff0c;配件全部通用。&#xff09;速印机在印刷的时候&#xff0c;经常…

USB2.0 Spec 中文篇

体系简介 线缆 USB 是一种支持热拔插的高速串行传输总线&#xff0c;使用一对&#xff08;两根&#xff09;差分信号来传输数据&#xff0c;半双工。要求使用屏蔽双绞线。 供电 USB 支持 “总线供电” 和 “自供电” 两种供电模式。在总线供电方式下&#xff0c;设备最多可…

Tofu目标识别跟踪模块

Tofu3 是多波段视频物体识别跟踪模块&#xff0c;支持可见光视频与红外视频的输入&#xff0c;支持激光补光变焦自适应控制&#xff0c;支持视频下的多类型物体检测、识别、跟踪等功能。 产品支持视频编码、设备管理、目标检测、深度学习识别、跟踪等功能&#xff0c;提供多机…

智慧灯杆技术应用分析

智慧灯杆是指在传统灯杆的基础上&#xff0c;通过集成多种先进技术实现城市智能化管理的灯杆。智慧灯杆技术应用的分析如下&#xff1a; 照明功能&#xff1a;智慧灯杆可以实现智能调光、时段控制等功能&#xff0c;根据不同的需求自动调节照明亮度&#xff0c;提高照明效果&am…

利用Pytorch预训练模型进行图像分类

Use Pre-trained models for Image Classification. # This post is rectified on the base of https://learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/# And we have re-orginaized the code script.预训练模型(Pre-trained models)…

大型科技公司与初创公司:选择哪一个?

你有没有想过&#xff0c;特别是在你职业生涯的开始&#xff0c;选择什么类型的公司&#xff1f;它应该是一家像谷歌、亚马逊、Meta 这样的大型科技公司&#xff0c;还是为一家小型初创公司工作。在本文中&#xff0c;我们将讨论实际差异是什么&#xff0c;并帮助你选择最适合你…

『OPEN3D』1.8.3 多份点云配准

多份点云配准是将多份点云数据在全局空间中对齐的过程。通常,输入是一组数据(例如点云或RGBD图像){Pi}。输出是一组刚性变换{Ti},使得经过变换的点云在全局空间中对齐。 NNNNNathan 本专栏地址: https://blog.csdn.net/qq_41366026/category_12186023.html 此处是…

DHCP—动态主机配置协议

动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是RFC 1541&#xff08;已被RFC 2131取代&#xff09;定义的标准协议&#xff0c;该协议允许服务器向客户端动态分配IP地址和配置信息。 DHCP协议支持C/S&#x…

RocketMQ 总体概括

目录 概述RocketMQ 领域模型MQ 解决的问题电商平台案例初步设计引入中间件设计 MQ 选型结束 概述 官网地址 RocketMQ 领域模型 官方领域模型概述 下面图&#xff0c;是在自己理解的基础上&#xff0c;对官方的模型图添加了一些。 Topic&#xff1a;主题&#xff0c;可以理解…

Java网络编程——基于UDP的数据报和套接字

java.net.ServerSocket与java.net.Socket建立在TCP的基础上。TCP是网络传输层的一种可靠的数据传输协议。如果数据在传输途中被丢失或损坏&#xff0c;那么TCP会保证再次发送数据&#xff1b;如果数据到达接收方的顺序被打乱&#xff0c;那么TCP会在接收方重新恢复数据的正确顺…

扬声器(喇叭)

扬声器(喇叭) 电子元器件百科 文章目录 扬声器(喇叭)前言一、扬声器(喇叭)是什么二、扬声器(喇叭)的类别三、扬声器(喇叭)的应用场景四、扬声器(喇叭)的作用原理总结前言 扬声器广泛应用于音响系统、公共广播系统、汽车音响、电视、电脑和移动设备等各种电子设备…

Linux基本开发工具

编译器和自动化构建工具 一、编译器——gcc、g1. 安装 gcc/g2. 使用3. 链接库4. 拓展命令&#xff1a;od/file/ldd/readelf 二、自动化构建项目——make、makefile1. 介绍2. 使用例子touch——change file timestampsstat——display file or file system status修改时间 .PHON…

Qt 文字描边(基础篇)

项目中有时需要文字描边的功能 1.基础的绘制文字 使用drawtext处理 void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);painter.setRenderHint(QPainter::SmoothPixmapTransform, true);painte…

ceph的osd盘删除操作和iscsi扩展

ceph的osd盘删除操作 拓展:osd磁盘的删除(这里以删除node1上的osd.0磁盘为例) 1, 查看osd磁盘状态 [rootnode1 ceph]# ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.00298 root default -3 0.00099 host node10 hdd 0.00…

【Vins轨迹】pose_graph位姿图加载EVO精度评定

1. Vins的位姿图加载功能 如果想要对slam运行后的位姿轨迹进行评定&#xff0c;需要将数据保存到output文件夹中。 其中pose_graph.txt含有的信息&#xff1a;关键帧id、时间戳、vio的xyz、优化后的xyz、vio的四元数、优化后的四元数、回环到的关键帧id、回环信息&#xff08…

【十】python复合模式

10.1 复合模式简介 在前面的栏目中我们了解了各种设计模式。正如我们所看到的&#xff0c;设计模式可分为三大类:结构型、创建型和行为型设计模式。同时&#xff0c;我们还给出了每种类型的相应示例。然而&#xff0c;在软件实现中&#xff0c;模式并是不孤立地工作的。对于所…

HPM5300系列--第一篇 命令行开发调试环境搭建

一、目的 在之前的博客中《HPM6750系列--第二篇 搭建Ubuntu开发环境》、 《HPM6750系列--第三篇 搭建MACOS编译和调试环境》我们介绍了HPM6750evkmini开发环境的搭建过程&#xff0c;由于HPM5300系列共用一套hpm-sdk&#xff0c;故HPM5300的开发调试环境的搭建过程基本和之前的…

智能故障诊断期刊推荐【中文期刊】

控制与决策 http://kzyjc.alljournals.cn/kzyjc/home 兵工学报 http://www.co-journal.com/CN/1000-1093/home.shtml 计算机集成制造系统 http://jsjjc.soripan.net/ 机械工程学报 http://www.cjmenet.com.cn/CN/0577-6686/home.shtml 太阳能学报 https://www.tynxb.org.c…

Visual Studio Code中的任务配置文件tasks.json中的可选任务组tasks详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、引言 vscode是支持通过配置可以实现类似Visual C等IDE开发工具使用菜单和快捷键直接进行程序编译构建的&#xff0c;这样构建的任务可以结合后续的调试配置进行IDE环境的程序调试&#xff0c;不过在之前…