深度优先搜索---全排列

该博客探讨了如何利用深度优先搜索算法求解1到n的全排列问题。通过递归调用和标记数组避免重复,实现所有可能的数字组合。
摘要由CSDN通过智能技术生成

题目要求:

输入一个数n,输出1~n的全排列。比如,输入3,输出123、132、213、231、312、321。


解题思路:

用深度优先搜索,假设有n个盒子,从第一个盒子开始依次放直到放到最后一个盒子,期间用到递归调用。放到最后一个后,再依次返回,进行重新组合,其中还用到标记数组来判断是否被用过。


代码实现:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int a[10], book[10], n;
void dfs(int step) {//step表示现在站在第几个盒子面前
	int i;
	if (step == n + 1) {//如果站在第n+1个盒子面前,表示前n个盒子已经放好了扑克牌
		for (i = 1; i <= n; i++)
			printf("%d", a[i]);
		printf("\n");
		return;//返回之前的一步,即最近一次调用dfs的地方
	}

	//此时站在第step个盒子面前应该放那张牌呢?按照1、2、3...n的顺序一一尝试
	for (i = 1; i <= n; i++) {
		//判断扑克牌i是否还在手上
		if (book[i] == 0) {//表示第i号扑克牌在手上
			//开始尝试使用扑克牌
			a[step] = i;
			book[i] = 1;//表示i号扑克牌已不在手上

			//第step个盒子已经放好,接下来要走下一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值