DFS 算法:全排列问题

在这里插入图片描述

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页

往 {\color{Red} {\Huge 往} } 期 {\color{Green} {\Huge 期} } 文 {\color{Blue} {\Huge 文} } 章 {\color{Orange} {\Huge 章}}


此系列更新频繁,求各位读者点赞
关注我可以了解更多内容哦
偷偷告诉你,我正在冲 1100 粉 {\color{Gray} {\small 偷偷告诉你,我正在冲1100粉} } 偷偷告诉你,我正在冲1100
你们有什么想了解的可以发在评论区,我会仔细的看 {\color{Gray} {\small 你们有什么想了解的可以发在评论区,我会仔细的看} } 你们有什么想了解的可以发在评论区,我会仔细的看
1100 粉时我会抓几个做文章 {\color{Gray} {\small1100粉时我会抓几个做文章} } 1100粉时我会抓几个做文章


今天我们学什么

今天我们要学习的是——全排列问题!
我们将会以一道“简单”的题入手,带你了解这个“有趣”的算法

例题

那么例题就是——全排列问题!
题目如下

全排列问题

题目

你可能会想要一个for循环暴力枚举,但是这样太慢了
我们可以使用dfs
作为OIer / coder的你听到了我的话, 打出了GG 打出了一下的代码

#include <bits/stdc++.h>
using namespace std;

int n, a[15];
bool flag[15];

void dfs(int step) {
	// 如果step超过了n,说明已经填满了所有位置,打印当前排列
	if (step > n) {
		for (int i = 1; i <= n; i++) {
			printf("%5d", a[i]);
		}
		printf("\n");
		return;
	}
	// 遍历所有可能的数字,填入当前位置
	for (int i = 1; i <= n; i++) {
		// 如果数字i没有被使用过,进行递归
		if (!flag[i]) {
			flag[i] = true; // 标记数字i被使用
			a[step] = i; // 将数字i填入当前位置
			dfs(step + 1); // 递归填下一个位置
			flag[i] = false; // 恢复数字i未被使用
		}
	}
}

int main() {
	scanf("%d", &n);
	dfs(1); // 从第一个位置开始填数字
	return 0;
}

怎么样,全排列问题是不是很简单呢?

总结

以下内容使用了AI大模型

以上代码是一个用于输出1到n的全排列的程序。通过深度优先搜索的方式实现,利用flag数组标记数字是否已经被使用过,a数组存储当前的排列。程序从第一个位置开始填数字,递归地对下一个位置进行填数,直到填满所有位置,打印当前排列。

思路步骤:

输入n表示全排列的长度。
调用dfs(1)开始填数字。
在dfs函数中,如果当前位置大于n,表示已经填满了所有位置,打印当前排列。
遍历所有可能的数字,如果某个数字没有被使用过,标记为已使用,填入当前位置,然后递归地填下一个位置。
递归完成后,恢复当前数字为未使用状态,继续遍历下一个可能的数字。
递归结束后,返回主函数。
该程序可以生成1到n的全排列,并按照一定格式进行输出。

再见!记得关注我哦

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值