回溯算法(相关解题):

求子集序列:

解题思路:

  • 已知原集合的数据位数为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,一经查实,立即删除!

相关文章

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

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

UE4-光照重建

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

判断字符串,数组方法

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

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

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

# 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为例…

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

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

微服务(网关路由)

目录 一&#xff1a;网关路由 1&#xff1a;认识网关 2&#xff1a;快速入门 2.1&#xff1a;创建项目 2.2&#xff1a;引入依赖 2.3&#xff1a;启动类 2.4&#xff1a;路由配置 2.5&#xff1a;测试 3&#xff1a;路由过滤 二&#xff1a;网关登录校验 1&…

58、主从复制数据库+读写分离

mysql的主从复制和读写分离&#xff08;面试问原理&#xff09; mysql的主从复制和读写分离&#xff1a; 主从复制 面试必问 主从复制的原理。 读写分离&#xff0c;MHA 一、主从复制 1.1、主从复制的模式&#xff1a; 1、mysql的默认模式&#xff1a; 异步模式&#xf…

RocketMQ集群搭建,看完这篇文章你就懂了(基于2m-2s-async模式)

前言 上一篇初步认识了RocketMQ&#xff0c;这一篇文章我们简单来搭建一个RocketMQ集群。RocketMQ支持多种集群部署模式&#xff0c;其中最常用的是多主多从的异步复制模式&#xff08;2m代表两个master&#xff0c;2s代表两个slave&#xff0c;async代表异步刷盘的机制&#…

乐鑫ESP32-H2设备联网芯片,集成多种安全功能方案,启明云端乐鑫代理商

在数字化浪潮的推动下&#xff0c;物联网正以前所未有的速度融入我们的日常生活。然而&#xff0c;随着设备的激增&#xff0c;安全问题也日益成为公众关注的焦点。 乐鑫ESP32-H2致力于为所有开发者提供高性价比的安全解决方案&#xff0c;这款芯片经过专门设计以集成多种安全…

[Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备

title: [Armbian] 部署Docker版Home Assistent&#xff0c;安装HACS并连接米家设备 date: 2024-07-21T10:51:23Z lastmod: 2024-07-21T11:40:39Z [Armbian] 部署Docker版Home Assistent&#xff0c;安装HACS并连接米家设备 官网&#xff1a;Home Assistant (home-assistant.i…

FoundationDB 基本使用

目录 一、FoundationDB介绍 二、安装单机版FoundationDB 2.1 下载安装程序 2.2 安装FoundationDB 2.3 修改配置信息 2.4 管理FoundationDB服务 三、fdbcli的常用命令 3.1连接数据库 3.2退出fdbcli 3.3查看版本 3.4 写模式 3.5写入键值 3.6读取键值 3.7删除键值 …

无法连接到internet怎么办?已连接但无internet访问,其实并不难

有时我们会遇到无法连接到Internet的问题&#xff0c;由多种原因引起&#xff0c;包括硬件故障、软件设置问题、网络供应商故障等。本文将介绍无法连接到Internet时可以采取的步骤。 简述 当你无法连接到Internet时&#xff0c;可以按照以下步骤进行检查和解决&#xff1a; 1…

python实现特征检测算法4

python实现Richardson-Lucy 反卷积算法 Richardson-Lucy 反卷积算法算法原理Python实现详细解释Richardson-Lucy算法的优缺点应用领域Richardson-Lucy 反卷积算法 Richardson-Lucy反卷积算法是一种迭代算法,用于恢复因成像系统中的点扩散函数(PSF)导致的模糊图像。该算法最…

TCP系列(一)-介绍TCP

服务 TCP和UDP同样使用IP提供的服务&#xff0c;但是TCP提供的是面向连接&#xff0c;可靠的字节流服务 面向连接 使用TCP进行通信双方&#xff0c;必须先建立连接&#xff0c;然后进行数据交换 可靠服务 将应用数据分割成固定大小的报文段每次发出报文&#xff0c;会启动定时…

分享从零开始学习网络设备配置--任务6.1 实现计算机的安全接入

项目描述 随着网络技术的发展和应用范围的不断扩大&#xff0c;网络已经成为人们日常生活中必不可少的一部分。园区网作为给终端用户提供网络接入和基础服务的应用环境&#xff0c;其存在的网络安全隐患不断显现出来&#xff0c;如非人为的或自然力造成的故障、事故&#xff1b…

昇思25天学习打卡营第09天|使用静态图加速

MindSpore支持两种运行模式&#xff1a;动态图&#xff08;PyNative模式&#xff09;和静态图&#xff08;Graph模式&#xff09;。 动态图模式下&#xff0c;计算图的构建和计算同时发生&#xff0c;适合调试和开发&#xff0c;但不利于优化。 静态图模式下&#xff0c;计算…