深度优先搜索之全排列问题(C语言版)

本文的一些参考:

DFS (深度优先搜索) 算法详解 + 模板 + 例题,这一篇就够了_dfs算法-CSDN博客

首先把深度优先搜索算法的基本概论摆出来

深度优先搜索算法(Depth First Search,简称DFS):

一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

说白了就是沿着一条路走到底,然后发现没路了就开始回头走(回溯),走到上一个路口再按其他的没走过的路再走到底,再回头.......直到把这个路口的路走完了再回到这个路口的上一个路口,如此反复直到把路都走完!!!!!!

一、基本思想

为了求得问题的解,先选择某一种可能情况向前探索;

在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索;

如此反复进行,直至得到解或证明无解。

二、操作步骤示例:

初始原点为v0,使用深度优先搜索,首先访问 v0 -> v1 -> v2 -> v5,到 v5 后面没有结点,则回溯到 v1 ,即最近的且连接有没访问结点的结点v1;

此次从 v1 出发,访问 v1 -> v4 -> v6 -> v3,此时与v3相连的两个结点 v0 与 v6 都已经访问过,回溯到 v6 (v6 具有没访问过的结点);

此次从 v6 出发,访问 v6 -> v7,到 v7 后面没有结点,回溯;

一直回溯到源点 v0 ,没有没访问过的结点,程序结束。

注:下面图中箭头为回溯方向

三、代码模板
#include<stdio.h>
int n; //从n个数据中取
int a[1001]; //用来存储被读取数据
int book[1001]; //用来标记是否被访问(读取)
int s=0; //记录符合条件的次数void dfs(int sept){if(sept>n){ //已经把n个数据都读完了,可以进行相应的一些打印之类的操作for(int i=1;i<=n;i++){printf("%d ",a[i]);}printf("\n");}else{ //要是没读完就继续读数据for(int i=1;i<=n;i++){ //一个个遍历找还没读取的if(book[i]==0){ //0代表还没有被标记即未取出book[i]=1; //把这个数据标记为1即已经取出a[sept]=i; //把这个数据存进a里dfs(sept+1); //前sept个元素就已经取出来了现在去取后面的元素,直到全部取出为止book[i]=0; //取完了就把标记释放方便下次取出即回溯}}}
}int main()
{scanf("%d",&n);dfs(1);return 0;
}

把概念和算法的底层逻辑搞明白之后就开始实战

全排列

按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

 输入格式:

一个整数 n(n<=5)。

输出格式:

由 1~n 组成的所有不重复的数字序列,每行一个序列。

输入样例:

3
输出样例:
1 2 3 
1 3 2 
2 1 3 
2 3 1 
3 1 2 
3 2 1 
解题思路:

这是一个很经典的多叉数,就按照上面的这种顺序来进行深度优先搜索就行了

还是没懂可以看看这篇

C语言全排列算法(最详细讲解)-CSDN博客

代码实现:
#include<stdio.h>
//深度优先搜索
int n;//对n个数进行全排列
int book[1001];//标记
int a[10];//存储数据void dfs(int step){//step为现在排到第几个数了if(step>n){for(int i=1;i<=n;i++){if(i<n){printf("%d ",a[i]);}else{printf("%d\n",a[i]);}}}else{for(int i=1;i<=n;i++){if(book[i]==0){a[step]=i; //拿下该值book[i]=1; //标记dfs(step+1); //往下遍历book[i]=0; //回溯}}}
}int main()
{scanf("%d",&n);dfs(1); //启动!return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何防止苹果MacOS进入休眠状态

前言 远程控制的时候&#xff0c;发现MacOS已经进入了休眠状态。如何设置MacOS&#xff0c;防止其进入休眠状态&#xff0c;这样才能远程控制。 1、进入系统偏好设置 显示器自动关闭了不要紧。只要操作系统不进入休眠就可以。

云计算:定义、类型及对企业的影响

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企业的影响 云计算&#xff1a;定义、类型及对企…

Pr 视频过渡:沉浸式视频

效果面板/视频过渡/沉浸式视频 Video Transitions/Immersive Video Adobe Premiere Pro 的视频过渡效果中&#xff0c;沉浸式视频 Immersive Video效果组主要用于 VR 视频剪辑之间的过渡。 自动 VR 属性 Auto VR Properties是所有 VR 视频过渡效果的通用选项。 默认勾选&#x…

ArcGIS Pro SDK Addin-DAML

ArcGIS Pro SDK Addin-DAML 文章目录 ArcGIS Pro SDK Addin-DAML1 Panes: 重置窗格2 Button: 从功能区中移除核心按钮3 Button: 将新按钮插入功能区上的现有组4 Menu: 在图层上下文菜单中插入一个新按钮5 Menu: 在 Map Container 上下文菜单中插入新菜单6 Menu: 在2D Map上下文…

【电机控制器】STC8H1K芯片——ADC电压采集

【电机控制器】STC8H1K芯片——ADC电压采集 文章目录 [TOC](文章目录) 前言一、ADC1.ADC初始化1.ADC_CONTR2.ADCCFG3.ADCTIM4.代码 2.ADC读取1.ADC_RES、ADC_RESL2.代码 3.VREF电压读取——MCU工作电压1.MCU工作电压计算公式2.代码 4.ADC被转换通道的输入电压读取1.ADC被转换通…

SpringBoot基础系列学习(三):日志

文章目录 一丶日志控制台介绍二丶日志的用法三丶日志级别四丶配置文件参数及介绍五丶slf4j 一丶日志控制台介绍 只要引用了spring-boot-starter依赖,就无需引入日志依赖,里面自带了logging依赖,默认情况下,springBoot使用Logback来记录日志,并用INFO级别输出到控制台 二丶日…

鸿蒙系统:安卓与iOS的强劲对手

随着科技的迅猛发展&#xff0c;“纯血鸿蒙”系统HarmonyOS Next 5.0系统的推出引起了业界的广泛关注。用户们对这一新系统充满好奇&#xff0c;急切地想要体验其带来的变革。鸿蒙系统以其创新的设计和技术支持&#xff0c;成为与安卓和iOS并列的第三大操作系统。 鸿蒙系统的独…

Redis - 哨兵(Sentinel)

Redis 的主从复制模式下&#xff0c;⼀旦主节点由于故障不能提供服务&#xff0c;需要⼈⼯进⾏主从切换&#xff0c;同时⼤量 的客⼾端需要被通知切换到新的主节点上&#xff0c;对于上了⼀定规模的应⽤来说&#xff0c;这种⽅案是⽆法接受的&#xff0c; 于是Redis从2.8开始提…

Golang | Leetcode Golang题解之第552题学生出勤记录II

题目&#xff1a; 题解&#xff1a; const mod int 1e9 7type matrix [6][6]intfunc (a matrix) mul(b matrix) matrix {c : matrix{}for i, row : range a {for j : range b[0] {for k, v : range row {c[i][j] (c[i][j] v*b[k][j]) % mod}}}return c }func (a matrix) p…

放电电阻是什么

放电电阻&#xff0c;顾名思义&#xff0c;就是用于放电的电阻。在电路中&#xff0c;当电流突然增大时&#xff0c;如果没有适当的电阻来限制电流&#xff0c;就可能导致电路损坏。因此&#xff0c;放电电阻的作用就是在电路中起到限制电流的作用&#xff0c;防止电路因电流过…

CelebV-Text——从文本生成人脸视频的数据集

概述 近年来&#xff0c;生成模型在根据文本生成和编辑视频方面受到了广泛关注。然而&#xff0c;由于缺乏合适的数据集&#xff0c;生成人脸视频领域仍然是一个挑战。特别是&#xff0c;生成的视频帧质量较低&#xff0c;与输入文本的相关性较弱。在本文中&#xff0c;我们通…

【51单片机数码管的控制开机时前四位数码管显示0000,每按下一次按键后松开数字加121,当数字大于等于8888时清零。】2022-3-18

缘由51单片机数码管的控制-嵌入式-CSDN问答 #include "REG52.h" sbit K1 P3^1; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128,119,124,57,94,121,113};//0-9. void smxs(unsigned char mz, unsigned char w) {unsigned char Xd0;P2255;P2255…

境内部署DIfy(中篇)

背景&#xff1a; 接 本文上篇中已经讲述了比较友好的一种境内安装Dify 的方式&#xff0c;这种方式可以拉取到最新的镜像源&#xff0c;最新的版本&#xff0c;最为推荐的方案。但由于各种原因或多或少会出现上述方式不成功的可能&#xff08;镜像源又被屏蔽&#xff09;&…

【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化

文章目录 引言环境准备数据集说明 项目结构主要文件说明 导入必要的软件包软件包功能简述 辅助函数定义加载配置文件加载数据集预处理数据集函数功能详解 集成LLM进行模型选择调用LLM的函数定义函数功能详解 清理和验证LLM的输出清理超参数建议提取模型名称验证超参数修正超参数…

我与Linux的爱恋:基础IO 软硬连接+动静态库

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 文章目录 一、软硬链接使用对应的特征 内容 以及作用二、动态库静态库的制作打包与使用生成静态库库搜索路径动态库的打包以及使用生成动态库一、软硬链接 使用 软连接 硬链接​ ​ 通过观察我们可以发现: 1.l…

CCF ChinaOSC |「开源科学计算与系统建模openSCS专题分论坛」11月9日与您相约深圳

2024年11月9日至10日&#xff0c;以“湾区聚力 开源启智”为主题的2024年中国计算机学会中国开源大会&#xff08;CCF ChinaOSC&#xff09;将在深圳召开。大会将汇聚国内外学术界、顶尖科技企业、科研机构及开源社区的精英力量&#xff0c;共同探索人工智能技术和人类智慧的无…

stm8开发笔记--STVD开发软件的安装

文章目录 1 开发软件安装1.1 安装软件1.2 编译器下载安装1.2.1 下载编译器1.2.2 安装1.2.3 添加密钥 1.3 编译器地址配置 2 编程开发2.1 下载软件开发包2.2 解压&#xff0c;打开工程2.3 选择对应芯片2.4 点击重新编译&#xff0c;不要有错误2.5 如果提示你&#xff0c;需要加载…

RNN天气预测

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 与上篇一样&#xff0c;依然是二维数据结构。这里通过构建基础的网络块来做天气类别的预测&#xff0c;网络如下&#xff1a; 预测是否下雨# 1.搭建神经网络 model Sequential() # 添加第一密集…

Elasticsearch如果集群出现节点故障,我应该如何快速定位问题?

当 Elasticsearch (ES) 集群发生故障时&#xff0c;快速定位问题源头非常重要。Elasticsearch 是一个分布式系统&#xff0c;故障可能由多种原因引起&#xff0c;涉及到硬件、配置、网络、集群本身的健康状况等多个层面。以下是一些定位问题的步骤和工具&#xff1a; 检查集群…

科研绘图系列:R语言热图和点图(heatmap dotplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包准备画图主题数据链接导入数据热图1热图2其他图1其他图2系统信息介绍 热图(Heatmap)是一种数据可视化技术,用于通过颜色的变化来展示数据矩阵中的数值大小。它通常由行和…