回溯算法(相关解题):

求子集序列:

解题思路:

  • 已知原集合的数据位数为N,则可以通过二进制比对原来集合,二进制位为1则输出集合上的该位数据,为0则空,二进制的01排序规律与子集的输出一致
  • 由集合的位数可以判断出二进制的范围 0 ~(1<<N)
    • 第一重循环:for (int i = 0; i < (1 << n); i++)
  • 由二进制的0 1 判断当前集合的该位数字是否输出
    • 第二重循环判断集合每一位进行比较:for (int j = 0; j < N; j++)
  • 二层循环判断循环位是否输出:if (i & (1 << j))
  • cout << str[j] << " ";
  1. 有一个集合由A-Z这26个字母组成,前N位的子集输出,打印这个集合的所有子集,每个子集一行,写C代码实现,不能使用递归
void Subset(string str, int n)
//有一个集合由A-Z这26个字母组成,前N位的子集输出
//打印这个集合的所有子集,每个子集一行,写C代码实现,不能使用递归
{for (int i = 0; i < (1 << n); i++){for (int j = 0; j < n; j++){if (i & (1 << j))cout << str[j] << " ";}cout << endl;}
}
int main()
{string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";Subset(str, 6);return 0;
}

2.给你一个整数数组 nums ,数组中的元素互不相同 。返回该数组所有可能的子集

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

class Solution {
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>>v;vector<int>tmp;int n=nums.size();for(int i=0;i<(1<<n);i++){tmp.clear();for(int j=0;j<n;j++){if(i&(1<<j))tmp.push_back(nums[j]);}v.push_back(tmp);}return v;}
};

求数据的全排列:

函数:bool next_permutation(起始迭代器,结束迭代器);

在调用 next_permutation 之前,你需要确保 nums 是按字典序排列的升序或降序都可以,但通常选择升序),因为 next_permutation 会生成给定序列的下一个排列。如果 nums 不是有序的,那么第一次调用 next_permutation 将不会得到正确的结果

我们知道有一全排列的函数可以直接使用,该函数返回可否继续排列的bool值

int main()
{vector<int>v{ 1,2,3,4 };do {for (auto it : v)cout << it << " ";cout << endl;} while (next_permutation(v.begin(), v.end()));return 0;
}

自己实现算法解析:

//解题精髓:
一个数字:本身一个
两个数字:{1,2}->{1,2},{2,1}
三个数字:{1,2,3}->{1,{2,3}}{2,{}} {3,{}}四个数字:{1,2,3,4}->{1,{2,3,4}}{2,{}} {3,{}}{4,{}}
划分大边距到小边距 的交换
当交换距离为1时,表示当前唯一,无需交换,插入数组
从大边距缩减,并且大边距可以通过交换,得到所有可能性
class Solution {
public:void swap(int&a,int&b){int tmp=a;a=b;b=tmp;}vector<vector<int>> _permute(vector<vector<int>>&v,vector<int>& nums,int b,int e){if(e-b==1)v.push_back(nums);else{for(int i=b;i<e;i++){swap(nums[b],nums[i]);_permute(v,nums,b+1,e);swap(nums[b],nums[i]);}}return v;}vector<vector<int>> permute(vector<int>& nums){//自己实现:vector<vector<int>>v;return _permute(v,nums,0,nums.size());}//调用函数实现:// vector<vector<int>> permute(vector<int>& nums) {// vector<vector<int>> v;// sort(nums.begin(),nums.end());// do{//     v.push_back(nums);// }while(next_permutation(nums.begin(),nums.end()));// return v;// }
};

N皇后:

N*N 的棋盘上,有N位皇后,但是!两两皇后不能在同一行、同一列、同一对角线!

解题思路:

  • N行N列中,存放N位皇后
  • 我们尝试在一行中的每个位置放置皇后,并判断该位置是否与先前的其他皇后冲突
  • 冲突判断,所有皇后不在同一列:v[j] == v[i],一对角线:abs(v[i] - v[j]) == (i - j)
  • 我们只关心不冲突的情况下,冲突时则回溯到上一级,继续for()判断这一行下一列位置
  • 不冲突时,默认这一行该位置已经确定,递归调用处理下一行需要确定的位置_solveNQueens(s,v,n,in+1)
  • 当我们确定了所有N皇后位置时,则插入vector<vector<string>>&s
class Solution {
public:bool Checkpos(vector<int>& v, int in) {  for (int i = 1; i <= in; i++) {  for (int j = i-1; j>=0; j--) { // 修改循环条件以避免越界  if (v[j] == v[i] || abs(v[i] - v[j]) == (i - j)) {  return true;  } } }  return false;  }void To_string(vector<vector<string>>&s,vector<int>v){vector<string>t(v.size(),string(v.size(),'.'));for(int i=0;i<v.size();i++){t[i][v[i]]='Q';     }s.push_back(t);}void _solveNQueens(vector<vector<string>>&s,vector<int>&v,int n,int in){for(int i=0;i<n;i++){if(in<n)v[in]=i;if(!Checkpos(v,in)){if(in==n-1)To_string(s,v);else_solveNQueens(s,v,n,in+1);}}return ;}vector<vector<string>> solveNQueens(int n) {vector<vector<string>>s;vector<int>v(n);_solveNQueens(s,v,n,0);return s;}
};

矩阵中的路径

class Solution {vector<vector<int>>f = { {1,0},{-1,0},{0,1},{0,-1} };
public:bool _exist(vector<vector<char>>& board, string word, vector<vector<bool>>& visited,int i, int j, int len) {if (len == word.size()){return true;}visited[i][j] = true;for (int k = 0; k < f.size(); k++){int h = f[k][0] + i;int l = f[k][1] + j;if (h >= 0 && h < board.size() && l >= 0 && l < board[0].size()){if (board[h][l] == word[len] && visited[h][l] == false)if (_exist(board, word, visited,  h, l, len + 1))return true;}}visited[i][j] = false;  // 回溯,标记为未访问       return false;}bool exist(vector<vector<char>>& board, string word) {int h = board.size();int l = board[0].size();vector<vector<bool>>visited(h, vector<bool>(l, false));for (int i = 0; i < h; i++){for (int j = 0; j < l; j++){if (board[i][j] == word[0]){if (word.size() == 1)return true;if (_exist(board, word, visited, i, j, 1))return true;}}}return false;}
};

我们需要关注每次访问后对被访问结点作标记,但是未访问成功后,需要撤除标记

以及在找到完整的word语句后,递归调用的返回值,依次返回给上一级直到原始调用层

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

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

相关文章

Direct3D 9的介绍以及Demo演示

文章目录 1、d3d9的介绍1. 概述2. 核心概念3. 初始化和渲染流程4. 常见用法5. 先进特性6. 总结 2、d3d9demo详解1.头文件和全局变量2.IGW 相关全局变量3.函数&#xff1a;CloseIGW4.函数&#xff1a;OpenIGW5.UI 控件和日志处理6.登录和登出相关函数7.登录回调函数8.DXUT 相关回…

P3-AI产品经理-九五小庞

AI产品的数据流向 美团外卖&#xff0c;实时只能调度 美团28分钟送达需求的分析 AI产品常用的算法 常用算法 常见的AI算法解析 自然语言生成NLG语音识别&#xff1a;科大讯飞&#xff0c;通义千问 虚拟现实机器学习平台 决策管理系统生物特征识别技术 RPA(机器人流程自动…

探索 GPT-4o Mini:开发者的新利器

文章目录 探索 GPT-4o Mini&#xff1a;开发者的新利器1. 引言2. GPT-4o Mini 的核心特点3. 使用 GPT-4o Mini 的实际案例3.1 客户支持自动化3.2 内容生成与创作3.3 代码生成与优化 4. 使用体验分享5. 未来展望6. 结论 探索 GPT-4o Mini&#xff1a;开发者的新利器 OpenAI 最新…

UE4-光照重建

当我们拉入新的光源和模型到我们的场景中后&#xff0c;会产生这样的情况&#xff1a; Preview:预览 表示此时由于光照物体所产生的阴影都是预览级别的并不是真正的效果。 方法一&#xff1a; 或者也可以在世界大纲中选中我们的光源&#xff0c;然后将我们的光源改变为可以…

JAVA基本概念(垃圾回收、API)- 10

一、垃圾分代回收机制 1. 垃圾回收针对的是堆内存 2. 对象在堆内存中存储,对象在使用完成之后会在不定的某个时刻被垃圾回收器(GC - Garbage Collector)解析 掉。现阶段回收过程无法手动控制。当调用构造方法的时候,创建好一个对象,因为Java中对每种数据类型都明确 给…

Jdk22新特性

JDK 22 引入了多项新特性,旨在提升 Java 语言的性能、简化开发过程以及增强代码的可读性和可维护性。以下是对 JDK 22 新特性的详细归纳: 核心Java库 外部函数和内存 API (JEP 454):提供了一个纯 Java 应用程序接口,用于替代 JNI(Java Native Interface),以支持直接调…

前端切片下载

要在Vue3前端实现文件切片下载&#xff0c;可以参考以下步骤&#xff1a; 分片函数&#xff1a;将文件分成多个小片段。 生成Blob对象&#xff1a;将片段转换为Blob对象。 创建下载链接&#xff1a;通过Blob对象创建下载链接。 合并下载的片段&#xff1a;下载完成后&#x…

判断字符串,数组方法

判断字符串方法 在JavaScript中&#xff0c;可以使用typeof操作符来判断一个变量是否为字符串。 function isString(value) {return typeof value string; } 判断数组 在JavaScript中&#xff0c;typeof操作符并不足以准确判断一个变量是否为数组&#xff0c;因为typeof会…

深入理解Python中的Pandas库

目录 Pandas简介安装PandasPandas的核心数据结构 SeriesDataFrame 数据加载与存储 从CSV文件读取数据从Excel文件读取数据从SQL数据库读取数据数据存储 数据操作 数据选择数据过滤数据排序数据分组与聚合数据透视表 数据清洗与处理 处理缺失值数据转换数据合并 数据可视化实战…

KingBase 下的 sys_hba.conf 详解

客户端访问KingbaseES数据库,需要建立身份的认证,sys_hba.conf相当于认证的黑白名单,可以通过配置sys_hba.conf允许或拒绝客户端对数据库服务器的访问。 sys_hba.conf原理: 客户端认证是由一个配置文件(通常名为sys_hba.conf并被存放在数据库集簇目录中)控制(HBA表示基…

《昇思25天学习打卡营第25天|第27天》

今天是学习的第二十七天&#xff0c;今天学习的是应用实践篇中计算机视觉中ShuffleNet图像分类。 从对ShuffleNet网络介绍开始学习&#xff0c;模型架构&#xff08;Pointwise Group Convolution&#xff0c;Channel Shuffle&#xff0c;ShuffleNet模块&#xff0c;构建Shuffl…

knowLedge-工具函数返回kb数值转换为KB,MB,GB等单位保留两位小数

1.场景 实现一个工具函数&#xff0c;将后端返回的单位为KB&#xff08;但实际上是kb&#xff0c;即千字节&#xff0c;注意大小写通常表示不同&#xff0c;这里我们按照常见需求处理为KB&#xff09;的数字转换成KB、MB、GB等形式&#xff0c;你可以按照以下步骤进行。这个函数…

【Mybatis整合Oracle】在 xml 文件中 WITH 子句的简单使用

在 Oracle SQL 中&#xff0c;WITH 子句用于定义一个或多个公共表表达式&#xff08;CTE, Common Table Expression&#xff09;&#xff0c;然后可以在主查询中引用这些表达式。WITH 子句通常用于简化复杂查询的结构&#xff0c;增强可读性&#xff0c;并避免重复编写相同的子…

# Redis 入门到精通(九)-- 主从复制(1)

Redis 入门到精通&#xff08;九&#xff09;-- 主从复制&#xff08;1&#xff09; 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用&#xff1f; 1&#xff09;单机 redis 的风险与问题 问题1.机器故障  现…

C++ 鼠标轨迹API【神诺科技SDK】

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型&#xff0c;如直线或曲线路径。然而&#xff0c;这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现&#xff0c;使得神诺科技 能够通过深度学习技术&#xff0c;学习并模拟更自然的鼠标移动行为。 二.…

java之对称字符串以及如何优化(链式编程)

import java.util.Scanner;public class ScannerDemo12 {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.next();//链式编程StringBuilder sbnew StringBuilder();sb.append(s…

国内大陆地区huggingface连接不上的解决方案

简介 本文主要介绍国内大陆地区huggingface连接不上的解决方案,希望能对学习大模型的同学们有所帮助。 1. 背景 最近有不少同学反应无法正常下载huggingface的模型文件,亲自尝试使用git clone下载huggingface上的大模型文件时,也同样无法正常下载,以Meta-Llama-3-8B为例…

全国区块链职业技能大赛第九套区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 房屋租赁平台中涉及到租客、房东、区块链租房平台、房屋等参与方,他们需要在区块链租房平台中完成账户注册、身份上链、出租房屋、生成合同等多种业务活动。通过对业务活动的功能分析,可以更好的服务系统的开发流程。基于房屋租赁平台…

数据结构之判断完全二叉树详解与示例(C,C++)

文章目录 一、判断完全二叉树的思路二、C语言实现三、C语言实现四、总结 完全二叉树是一种特殊的二叉树&#xff0c;它满足以下两个条件&#xff1a; 每一层&#xff08;除了最后一层&#xff09;都被严格地填充了节点。 最后一层的节点都尽可能地靠左对齐。 本文将详细介绍如…

undefined reference to rpl_malloc

编译 psmisc 时遇到这个错误&#xff0c;搜索了一下 rpl_malloc&#xff0c; grep -irwn rpl_malloc config.status:877:D["malloc"]" rpl_malloc" Binary file src/killall.o matches autom4te.cache/traces.1:979:m4trace:configure.ac:205: -1- AH_OUT…