DFS回溯-经典全排列问题(力扣)

前言

对于全排列问题,常用的做法是设置一个vis数组来确定位置i上的数字是否被访问,因为是全排列问题,所以不同的顺序也是不一样的排列,因此每次都是从起点开始询问**(注意起点到底是0还是1)**

46全排列(最简单的模板)

class Solution {
public:vector<int>v;//存储一个排列vector<vector<int>>ans;//答案int vis[10];void dfs(vector<int> & nums){int n = nums.size();if(v.size() == n){ans.push_back(v);return;}for(int i = 0; i < n; i++){if(vis[i])continue;vis[i] = 1;v.push_back(nums[i]);dfs(nums);v.pop_back();vis[i] = 0;}}vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ans;}};

解题思路

相比于全排列1,全排列2增加了重复数字,但要求不能出现重复的排列。例如原始序列1 2 1 那么全排列里 1 1 2 和 1 1 2 (两个序列的两个1位置互换了),仍然当一种排列。最好的办法就是对其进行剪枝

  if(i > 0 && nums[i] == nums[i - 1] && vis[i - 1] == 0) continue;//树层去重

借鉴卡哥的一幅图,给大家看一下
在这里插入图片描述

(类似题目)P8605 [蓝桥杯 2013 国 AC] 网络寻路

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<stack>
#include<cstdio>
#define rep(i,a,n) for(int i = a; i <= n; i++) 
#define per(i,a,n) for(int i = n; i >= a; i--)using namespace std;typedef long long ll;const int N = 10010;
vector<int> v[N];
int vis[N];
int n,m;
ll ans;
vector<int>st;
void dfs(int x){int n = v[x].size();if(st.size() == 3){//因为终点位置可以和起点相同,所以当路径元素为3个的时候,就开始特判 rep(i,0, n - 1){int tp = v[x][i];if(!vis[tp] || tp == st[0]) ans++;//没被访问或者是起点 }return ;}rep(i,0,n-1){int tp = v[x][i];if(!vis[tp]){vis[tp] = 1;st.push_back(tp);dfs(tp);st.pop_back();vis[tp] = 0;}}
}int main(){cin >> n >> m;int u,vv;rep(i,1,m){cin >> u >> vv;v[u].push_back(vv);v[vv].push_back(u);}rep(i,1,n){vis[i] = 1;st.push_back(i);dfs(i);vis[i] = 0;st.pop_back();}cout << ans;return 0;}

16全排列2

//leetcode
class Solution {
public:vector<int> v;vector<vector<int>>ans;int vis[10];vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums);return ans;}void dfs(vector<int>& nums){int n = nums.size();if(v.size() == n){ans.push_back(v);return;}for(int i = 0; i < n; i++){if(vis[i])continue;if(i > 0 && nums[i] == nums[i - 1] && vis[i - 1] == 0) continue;//树层去重vis[i] = 1;v.push_back(nums[i]);dfs(nums);v.pop_back();vis[i] = 0;}}
};

解题思路

经典的回溯问题,但分解开来看就很简单了

1 初始化:

vector<vector<string>> ans;//答案
vector<string> v(n,string(n,'.'));//二维矩阵存图,vector是一个数组,每个数组元素又是string类型,所以可以看成C语言里char类型的二维数组
  1. 按行进行DFS递归
void dfs(int u, int n,vector<string>& v){//u代表下标为u的行if(u == n){ans.push_back(v);return;}for(int i = 0; i < n; i++){if(check(u,i,n,v)){v[u][i] = 'Q';dfs(u + 1, n,v);v[u][i] = '.';}}}

3 根据题目条件判断:不能同行 同列 同斜线,同行问题不会出现,因为咱们是按照行来递归遍历的,所以只需要判断同列 同斜线问题

int check(int x, int y,int n,vector<string> &v){for(int i = 0; i < x; i++){if(v[i][y] == 'Q') return 0;}for(int i = x - 1, j = y - 1; i >= 0&&j >= 0; i--, j--){if(v[i][j] == 'Q') return 0;}for(int i = x - 1, j = y + 1; i >= 0 && j <= n; i--,j++){if(v[i][j] == 'Q') return 0;}return 1;}
n皇后
class Solution {
public:vector<vector<string>> ans;vector<vector<string>> solveNQueens(int n) {vector<string> v(n,string(n,'.'));dfs(0,n,v);return ans;}int check(int x, int y,int n,vector<string> &v){for(int i = 0; i < x; i++){if(v[i][y] == 'Q') return 0;}for(int i = x - 1, j = y - 1; i >= 0&&j >= 0; i--, j--){if(v[i][j] == 'Q') return 0;}for(int i = x - 1, j = y + 1; i >= 0 && j <= n; i--,j++){if(v[i][j] == 'Q') return 0;}return 1;}void dfs(int u, int n,vector<string>& v){if(u == n){ans.push_back(v);return;}for(int i = 0; i < n; i++){if(check(u,i,n,v)){v[u][i] = 'Q';dfs(u + 1, n,v);v[u][i] = '.';}}}
};

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

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

相关文章

某资产管理系统打点过程中的免杀经历

上周&#xff0c;被扔过来单位内部的一个链接&#xff0c;让渗透一下&#xff0c;本以为三下五除二很快就能测完&#xff0c;没想到在对抗杀软时费了一番功夫&#xff0c;再加上杂七杂八的事儿&#xff0c;经过了一个星期才测完(&#xff03;&#xffe3;&#xff5e;&#xff…

C#知识点-21(初识数据库)

数据库与内存、文件的比较 内存&#xff1a; 优点&#xff1a;存取速度快 缺点&#xff1a;-容量小 -断电后&#xff0c;数据不会保存 文件&#xff1a; 优点&#xff1a;数据可以持久化保存 缺点&#xff1a;-读取速度慢…

mprpc分布式RPC网络通信框架

mprpc 项目介绍 该项目是一个基于muduo、Protobuf和Zookeeper实现的轻量级分布式RPC网络通信框架。 可以把任何单体架构系统的本地方法调用&#xff0c;重构成基于TCP网络通信的RPC远程方法调用&#xff0c;实现同一台机器的不同进程之间的服务调用&#xff0c;或者不同机器…

下载无水印抖音视频

在抖音看到某些视频想下载&#xff0c;却出现无法保存在本地【显示"作品暂时无法保存,链接已复制"】。或者下载的视频有水印。 而某些微信小程序下载可能需要付费或者有水印。其实我们可以直接使用电脑浏览器直接下载。 举个例子: 这是来自王道官方账号的一条视频链…

基于springboot的某大学外卖系统的实现(源码+论文)

文章目录 目录 文章目录 前言 一、功能设计 二、功能实现 1 后台登录 2管理员界面 3员工信息管理 4客户信息管理 三、库表设计 四、论文 前言 如今&#xff0c;信息化不断的高速发展&#xff0c;社会也跟着不断进步&#xff0c;现今的社会&#xff0c;各种工作都离不开信息化技…

Python基础二

一、变量 在编程中&#xff0c;变量是用来存储数据值的名称。在 Python 中&#xff0c;变量是动态类型的&#xff0c;这意味着你可以将任何类型的数据分配给一个变量&#xff0c;而不需要提前声明变量的类型。 1、全局变量 在函数外部定义的变量是全局变量&#xff0c;可以在程…

boost 编译

参考博客&#xff1a;vs2019 boost 入坑指南 boost下载 官方网站&#xff1a;https://www.boost.org/ 下面以boost_1_73_0为例&#xff1a; boost编译 解压boost_1_73_0.zip运行bootstrap.bat&#xff08;此时目录下会生成b2.exe&#xff09;编译boost b2 install --build…

【vue2项目总结】——动态渲染

文章目录 主页渲染封装接口页面调用传到子组件 搜索列表渲染根据关键字搜索分类id搜索 主页渲染 封装接口 封装准备接口 api/home.js import request from /utils/request// 获取首页数据 export const getHomeData () > {return request.get(/page/detail, {params: {p…

springboot3.x集成SpringDoc Swagger3

近期将springboox2.x升级到了3.x&#xff0c;索性将swagger2也同步升级到swagger3&#xff0c;具体过程如下。 一、添加maven依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>…

用户角色的重要性:确保财务数据安全的最佳方式

在企业的财务管理业务中&#xff0c;一个人几乎不可能完成所有的财务记账任务&#xff0c;例如设定预算、发票审批等等&#xff0c;至少不能有效地执行。最为明智的方式&#xff0c;是将这些任务分派给特定的人员&#xff0c;比如部门经理、财务经理或者销售、市场人员等等。 但…

C++读取NC数据的结果与真实数值不一致的解决方法

本文介绍基于C 语言的netCDF库读取.nc格式的栅格文件时&#xff0c;代码读取到的数据与栅格文件的实际数据不一致的解决方法。 最近&#xff0c;由于需要读取ERA5气象数据&#xff0c;因此使用C 语言中的netCDF库读取.nc格式文件。其中&#xff0c;偶然发现在Visual Studio的代…

CC攻击的特征和防护措施

随着互联网的快速发展&#xff0c;网络攻击日益频繁。在目前的各种网络攻击中&#xff0c;CC攻击是一种常见的网络攻击手段之一。CC攻击&#xff08;也称为DDoS攻击&#xff09;是指通过大量请求或恶意流量向目标网站或服务器发送请求&#xff0c;以使其服务不可用。可能大家都…

Error:java:JDK isn‘t specified for module “模块名称“

可能是创建模块后不小心删掉了.idea.或.idea出错 只要删除.idea&#xff0c;close project出去&#xff0c;重新进让idea自动下载

VS2022打包C#安装包(最新、最全)

开发c#的一个小工具到打包环境碰壁了&#xff0c;在网上找了很多资料耶踩了很多坑&#xff0c;耗时1hour才打包完毕&#xff0c;避免以后碰到类似的问题再次记录&#xff0c;自认为步骤比较全面&#xff0c;如果有帮助麻烦点个赞呗&#xff01;&#xff01;&#xff01; 一、Mi…

网易家居315特别策划 | MLILY梦百合荣获2024年度家居行业服务榜样

3月,网易家居“寻找家居服务榜样”315特别策划如期而至,重磅奖项“2024年度家居行业服务榜样”揭晓,该奖项授予在家居服务方面做出突出贡献、起到示范引领作用的先进企业。其中,MLILY梦百合荣获“2024年度家居行业服务榜样”重磅奖项。 伴随市场需求演变、企业发展驱动、产业升…

echarts使用总结

最近项目大量的曲线图,柱状图,饼图...总结一下使用过程中的小问题及解决方法 . 1.当x轴太拥挤,x轴数据不能全部展示怎么办? 这时候就只需要在xAxis的axisLabel对象中添加属性 interval : 0 就可以显示全部数据 , interval 属性是用来调整x轴数据的间距的 , 数值越大间距越大…

Linux基础命令[11]-find

文章目录 1. find 命令说明2. find 命令语法3. find 命令示例3.1 不加参数3.2 按照时间3.3 -empty&#xff08;空白文件或目录&#xff09;3.4 -name&#xff08;名称查找&#xff09;3.5 -size&#xff08;大小查找&#xff09;3.6 -type&#xff08;类型查找&#xff09;3.7 …

砝码称重 蓝桥杯

在C中&#xff0c;fabs()和abs()都用于计算数字的绝对值&#xff0c;但它们之间有一些区别。 fabs(double x)&#xff1a;计算浮点数x的绝对值&#xff0c;返回一个double类型的结果。 abs(int x)&#xff1a;计算整数x的绝对值&#xff0c;返回一个int类型的结果。 数组的默…

1w字带你快速入门Docker

1. 什么是容器 容器是一种轻量级的、可移植的、自包含的软件单元&#xff0c;它包含运行应用程序所需的所有内容&#xff0c;包括代码、运行时、系统工具、系统库和设置。容器与虚拟机类似&#xff0c;但它们更加轻量级&#xff0c;并且依赖于宿主内核。容器可以使用 Docker 等…

太阳能光伏电池的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 光伏电池的基本结构 4.2 光伏电池的工作原理 5.完整工程文件 1.课题概述 太阳能光伏电池的simulink建模与仿真.分析不同光照温度&#xff0c;光照强度下的光伏电池的U-I特性曲线以及P-V特性曲线。 …