实验四:回溯算法的设计与分析

某不知名学校大二算法课实验报告

题目来自力扣

第一题:幂集

力扣题目链接:幂集

题目描述:

幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。

说明:解集不能包含重复的子集。

示例:

 输入: nums = [1,2,3]

 输出:

[

  [3],

  [1],

  [2],

  [1,2,3],

  [1,3],

  [2,3],

  [1,2],

  []

]

经典的递归实现指数型枚举的模板题

画出递归搜索树,一层一层递归回溯即可

注意每次要恢复现场

模板大体如下:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

注释+代码如下:

class Solution {
public:vector<vector<int>>res; //答案vector<int>temp; //保存路径void dfs(vector<int>&nums, int value, int j) {if(value == temp.size()) //选到最后一个数时{res.push_back(temp); //保存路径}for(int i = j ; i < nums.size(); i ++ ){temp.push_back(nums[i]);dfs(nums,value, i + 1);temp.pop_back();//还原现场}}vector<vector<int>> subsets(vector<int>& nums) {int n = nums.size();for(int i = 1; i <= n; i ++ ){dfs(nums, i , 0); // 传入数组,第几个数,已选第几个数}res.push_back(vector<int>{});return res;}
};

第二题:N皇后Ⅱ

力扣题目链接:N皇后Ⅱ

题目描述:

给定一个整数 n,返回 n 皇后不同的解决方案的数量。

示例:

输入: 4

输出: 2

解释: 4 皇后问题存在如下两个不同的解法。

[

 [".Q..",  // 解法 1

  "...Q",

  "Q...",

  "..Q."],

 ["..Q.",  // 解法 2

  "Q...",

  "...Q",

  ".Q.."]

]

这道题居然是困难? 这是一道非常非常经典的板子题,学习搜索必定会遇到的一道题

这题我的思路是通过行h搜索,cot,dg,udg分别标记列,对角线和反对角线

首先全部格子默认成'.', 枚举每一个位置能不能放‘Q’,符合条件则res ++ ;

代码+注释如下:

class Solution {
public://const int N = 10;bool cot[20], dg[20], udg[20];char g[20][20];int res;void dfs(int h,int n){if( h == n) // 达到矩阵大小 答案加一{res ++ ;return;}for(int l = 0; l < n; l ++ ){//对角线h + l, 那么反对角线就是 n + h - lif(!cot[l] && !dg[h + l] && !udg[n + h - l]){g[h][l] = 'Q';cot[l] = dg[h + l] = udg[n + h - l] = true;dfs(h + 1, n);cot[l] = dg[h + l] = udg[n + h - l] = false;g[h][l] = '.';}}}int totalNQueens(int n) {for(int i = 0; i < n; i ++ ){for(int j = 0; j < n; j ++ ){g[i][j] = '.'; // 初始化}}dfs(0,n);return res;}
};

第三题:全排列

力扣题目链接:全排列

题目描述:

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]

输出:

[

  [1,2,3],

  [1,3,2],

  [2,1,3],

  [2,3,1],

  [3,1,2],

  [3,2,1]

]

这道题和第一题必须好好地对比学习,第一题是实现指数型枚举,这一题是实现排列型枚举

同样都是选不选的问题,同样都是递归搜索和回溯的问题,不过这会要多开一个数组保存路径

st数组标记有没有选过这个数字

代码如下:

class Solution {
public:vector<vector<int>>path;vector<int>temp;bool st[10];void dfs(int u, int n, vector<int>& nums){if(temp.size() == n){path.push_back(temp);return;}else{for(int i = 0; i < n; i ++ ){if(st[i] == false){st[i] = true;temp.push_back(nums[i]);dfs(u + 1, n, nums);temp.pop_back();st[i] = false;}}}}vector<vector<int>> permute(vector<int>& nums) {dfs(0, nums.size(), nums);return path;}};

第四题:二进制手表

力扣题目链接:二进制手表

题目描述:

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。

  • 例如,下面的二进制手表读取 "4:51" 。

给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。

小时不会以零开头:

  • 例如,"01:00" 是无效的时间,正确的写法应该是 "1:00" 。

分钟必须由两位数组成,可能会以零开头:

  • 例如,"10:2" 是无效的时间,正确的写法应该是 "10:02" 。

示例 1:

输入:turnedOn = 1
输出:["0:01","0:02","0:04","0:08","0:16","0:32","1:00","2:00","4:00","8:00"]

示例 2:

输入:turnedOn = 9
输出:[]

提示:

  • 0 <= turnedOn <= 10

思路:

构建一个可选择hour和minutes的数组,这里选择其实一共就是这10个bit,便于快速查找
递归时候就是看turnedOn是否被用完了,用完则返回结果;同时为了避免重复,每次遍历选择只选择当前序号后的数字;
剪枝: 排除不允许的情况 hour<=11 和 minutes<=59

代码+注释如下:

class Solution {
public:vector<string>res;void dfs(string& s, int start, int pointNum){if(pointNum == 3){if(isValid(s, start, s.size() - 1)){res.emplace_back(s);}return;}for(int i = start; i < s.size(); i ++ ){if(isValid(s, start, i)) {   s.insert(s.begin() + i + 1, '.'); // 插入点pointNum ++;dfs(s, i + 2, pointNum);pointNum -- ;s.erase(s.begin() + i + 1); //恢复现场} else break;}}bool isValid(string & s, int start, int end) {if(start > end) {return false;}if(s[start] == '0' && start != end) {return false;}int num = 0;for(int i = start; i <= end; i ++ ) {if(s[i] > '9' || s[i] < '0') {return false;}num = num * 10 + (s[i] - '0');if(num > 255){return false;}}return true;}vector<string> restoreIpAddresses(string s) {if(s.size() < 4 || s.size() > 12) return res;dfs(s, 0, 0);return res;}
};

第五题:复原ip地址

力扣题目链接:复原ip地址

 题目描述:

给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。

有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。

示例 1:

输入:s = "25525511135"

输出:["255.255.11.135","255.255.111.35"]

示例 2:

输入:s = "0000"

输出:["0.0.0.0"]

示例 3:

输入:s = "1111"

输出:["1.1.1.1"]

示例 4:

输入:s = "010010"

输出:["0.10.0.10","0.100.1.0"]

示例 5:

输入:s = "101023"

输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]

 提示:

0 <= s.length <= 3000

s 仅由数字组成

切割问题,跟一道题切割回文子串很像,主要是检查函数isValid难写

搜索过程如下:

代码+注释如下:

class Solution {
public:vector<string>res;void dfs(string& s, int start, int pointNum){if(pointNum == 3) //3个点分4段{if(isValid(s, start, s.size() - 1)){res.emplace_back(s); //函数功能类似于push_back}return;}for(int i = start; i < s.size(); i ++ ){if(isValid(s, start, i)) {   s.insert(s.begin() + i + 1, '.'); // 插入点pointNum ++;dfs(s, i + 2, pointNum);pointNum -- ;s.erase(s.begin() + i + 1); //恢复现场} else break;}}bool isValid(string & s, int start, int end)  // 检查函数{if(start > end) {return false;}if(s[start] == '0' && start != end) {return false;}int num = 0;for(int i = start; i <= end; i ++ ) {if(s[i] > '9' || s[i] < '0') {return false;}num = num * 10 + (s[i] - '0');if(num > 255){return false;}}return true;}vector<string> restoreIpAddresses(string s) {if(s.size() < 4 || s.size() > 12) return res;dfs(s, 0, 0);return res;}
};

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

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

相关文章

问:TCP/IP协议栈在内核态的好还是用户态的好

“TCP/IP协议栈到底是内核态的好还是用户态的好&#xff1f;” 问题的根源在于&#xff0c;干嘛非要这么刻意地去区分什么内核态和用户态。 引子 为了不让本文成为干巴巴的说教&#xff0c;在文章开头&#xff0c;我以一个实例分析开始。 最近一段时间&#xff0c;我几乎每…

【基础篇】七、Flink核心概念

文章目录 1、并行度2、并行度的设置3、算子链4、禁用算子链5、任务槽6、任务槽和并行度的关系 1、并行度 要处理的数据量很多时&#xff0c;可以把一个算子的操作&#xff08;比如前面demo里的flatMap、sum&#xff09;&#xff0c;"复制"多份到多个节点&#xff0c…

phpcms_v9模板制作及二次开发常用代码

0:调用最新文章&#xff0c;带所在版块 {pc:get sql"SELECT a.title, a.catid, b.catid, b.catname, a.url as turl ,b.url as curl,a.id FROM v9_news a, v9_category b WHERE a.catid b.catid ORDER BY a.id DESC " num"15" cache"300"} {lo…

postman接口测试

HTTP的接口测试工具有很多&#xff0c;可以进行http请求的方式也有很多&#xff0c;但是可以直接拿来就用&#xff0c;而且功能还支持的不错的&#xff0c;我使用过的来讲&#xff0c;还是postman比较上手。 优点&#xff1a; 1、支持用例管理 2、支持get、post、文件上传、响…

计网面试复习自用

五层&#xff1a; 应用层&#xff1a;应用层是最高层&#xff0c;负责为用户提供网络服务和应用程序。在应用层&#xff0c;用户应用程序与网络进行交互&#xff0c;发送和接收数据。典型的应用层协议包括HTTP&#xff08;用于网页浏览&#xff09;、SMTP&#xff08;用于电子邮…

如何提高企业工作微信的管理效率?

微信作为一款拥有数亿用户的软件&#xff0c;其使用频率在全国范围内居高不下。随着企业的不断发展&#xff0c;微信在工作中的应用也变得越来越广泛。为了更好地服务客户并提升业务效益&#xff0c;企业通常会为新入职员工配置工作微信以便于业务沟通和客户服务。然而&#xf…

iCloud涨价不用慌!学会使用群晖生态将本地SSD“上云”

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是想使用群晖生态软件&#xff0c;就必须要在服务端安装群晖系统&#xff0c;具体如何安装群晖虚拟机请参考&#xff1a; 1. 安装并配置synology drive1.1 安装群辉drive套件1.2 在局域…

存在已打开的MicrosoftEdge浏览器,无法执行安装

存在问题&#xff1a;UiBot Creator 安装Chrome扩展时&#xff0c;存在已打开的MicrosoftEdge浏览器&#xff0c;无法执行安装。 解决办法&#xff1a; 打开MicrosoftEdge浏览器&#xff0c;然后在浏览器页面右上角打开“…”图标 第二步&#xff0c;打开“…”图标之后&…

MAC上使用Wireshark常见问题

文章目录 介绍正文启动异常-Permission denied解决方法 过滤协议和地址指定源地址和目的地址调整 time format 介绍 简单记录Wireshark在日常使用过程中的遇到的小case。 正文 Wireshark相较于tcpdump使用较为简单&#xff0c;交互也更为友好。 点击Start即可启动抓包 启动…

【OpenCv光流法进行运动目标检测】

opencv系列文章目录 文章目录 opencv系列文章目录前言一、光流法是什么&#xff1f;二、光流法实例1.C的2.C版本3.python版本 总结 前言 随着计算机视觉技术的迅猛发展&#xff0c;运动目标检测在图像处理领域中扮演着至关重要的角色。在现实世界中&#xff0c;我们常常需要追…

Mysql5.7大限将至升级Mysql 8.0过程记录(未完)

一、前言 时间很快&#xff0c;到2023年10月底&#xff0c;MySQL 5.7就到了它的EOL&#xff08;End of Life&#xff09;&#xff0c;届时将不会提供任何补丁&#xff0c;无法应对潜在的安全风险&#xff1b;是时候和 MySQL 5.7 说再见了&#xff01;&#xff01;&#xff01;&…

C++语言实现网络爬虫详细代码

当然&#xff01;下面是一个用C语言实现的基本网络爬虫的详细代码示例&#xff1a; #include <iostream> #include <string> #include <curl/curl.h> size_t writeCallback(void* contents, size_t size, size_t nmemb, std::string* output) {size_t totalS…

强化科技创新“辐射力”,中国移动的数智化大棋局

作者 | 曾响铃 文 | 响铃说 丝滑流畅的5G连接、每时每刻的数字生活服务、无处不在的智能终端、拟人交流的AI助手、梦幻般的XR虚拟现实、直接感受的裸眼3D…… 不知不觉&#xff0c;那个科幻片中的世界&#xff0c;越来越近。 数智化新世界的“气氛”&#xff0c;由一个个具…

GEE 18:基于GEE平台的土地荒漠化监测与分析【论文复现】

Desertification 1. 研究背景1.1 参考论文1.2 参数获取1.2.1 NDVI1.2.2 Albedo1.2.3 Normalizing indices1.2.4 Calculating the quantitative relationship1.2.5 Calculating DDI2. GEE2.1 数据2.2 GEE code2.2.1 Study region2.2.2 Reomove cloud for Landsat-82.2.3 Calcula…

CISA 彻底改变了恶意软件信息共享:网络安全的突破

在现代网络安全中&#xff0c;战术技术和程序&#xff08;TTP&#xff09;的共享对于防范网络事件至关重要。 因此&#xff0c;了解攻击向量和攻击类型之间的关联如今是让其他公司从其他公司遭受的 IT 事件中受益&#xff08;吸取经验教训&#xff09;的重要一步。 美国主要网…

PyTorch入门教学——使用PyCharm创建一个PyTorch项目

首先需要创建好PyTorch的虚拟环境&#xff0c;步骤&#xff1a;PyTorch入门教学——简介与环境配置-CSDN博客打开PyCharm&#xff0c;新建项目&#xff0c;选择项目的存放位置。选择先前配置的解释器&#xff0c;也就是虚拟环境中的解释器。&#xff08;记住创建的虚拟环境所在…

【Express】服务端渲染(模板引擎 EJS)

EJS&#xff08;Embedded JavaScript&#xff09;是一款流行的模板引擎&#xff0c;可以用于在Express中创建动态的HTML页面。它允许在HTML模板中嵌入JavaScript代码&#xff0c;并且能够生成基于数据的动态内容。 下面是一个详细的讲解和示例&#xff0c;演示如何在Express中…

Linux:Mac VMware Fusion13以及CentOS7安装包

Linux&#xff1a;Mac VMware Fusion13以及CentOS7安装包 1. Mac VMware Fusion132. CentOS7安装包3. 安装 1. Mac VMware Fusion13 下载官网地址&#xff1a;https:www.vmware.com/products/fusion/fusion-evaluation.html 2. CentOS7安装包 注意是m芯片需要使用arm架构的i…

手动下载/安装Xcode的simulator

目录 前言解决方案1.获取simulator包下载地址1.1 Apple后台1.2 手动 2.使用三方下载工具下载3.使用命令安装simulator 前言 Xcode某个版本更新之后不带iOS的Simulator,导致全新下载一个Xcode后没法编译项目.公司的网又很坑,每次断掉点重试都重新下载,导致完全没法下下来.特别影…

论文阅读:Seeing in Extra Darkness Using a Deep-Red Flash

论文阅读&#xff1a;Seeing in Extra Darkness Using a Deep-Red Flash 今天介绍的这篇文章是 2021 年 ICCV 的一篇 oral 文章&#xff0c;主要是为了解决极暗光下的成像问题&#xff0c;通过一个深红的闪光灯补光。实现了暗光下很好的成像效果&#xff0c;整篇文章基本没有任…