递归实现排列型枚举--算法竞赛进阶指南

把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式
一个整数n。

输出格式
按照从小到大的顺序输出所有方案,每行1个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围
1≤n≤9
输入样例:
3
输出样例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

/*
主要思想:第一个位置枚举每一个数字,再枚举第二个位置,以此类推,以此枚举,直到最后一个位置 
*/

#include <cstdio>
#include <iostream>


using namespace std;
int n;
int num[10];//0-没有用下标的数字,1-使用了下标的数字 
int out[10];//下标代表位置,数字代表这个位置上的数字 

void dfs(int index)
{
	if(index == n)//枚举到最后一个数字完成,输出
	{
		for(int i = 0;i < n; i++)
		{
			printf("%d ",out[i]);
		}
		printf("\n");
		return;
	}
	
	for(int i = 0; i < n; i++)
	{
		if(num[i] == 0)//这个数字没有使用 
		{
			num[i] = 1;//使用这个数字 
			out[index] = i+1; 
			dfs(index+1);//对下一个位置进行枚举 
			num[i] = 0;//恢复现场 
		}
	}
}

int main()
{
	scanf("%d",&n);
	dfs(0);//从第一个位置开始 
	return 0;
} 
发布了36 篇原创文章 · 获赞 47 · 访问量 3972

猜你喜欢

转载自blog.csdn.net/qq_43800455/article/details/104650325