acwing 842. 排列数字

题目描述

给定一个整数 n,将数字 1∼n 排成一排,将会有很多种排列方法。

现在,请你按照字典序将所有的排列方法输出。

输入格式

共一行,包含一个整数 n。

输出格式

按字典序输出所有排列方案,每个方案占一行。

数据范围

1≤n≤7

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

dfs算法求解

分析

  • 使用path[]保存每层选择哪个数
  • 使用st[]标记每个数是不是被上面的某层使用过

代码

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

const int N = 10; //

int path[N]; // 用来存每层选择的数是哪个
bool st[N]; // 用来表示一个数是否被用过 

int n;

// 当前是第u层 ,从第0层开始 
void dfs(int u)
{
	if(u == n) // 到达第n层,可以输出并返回了 
	{
		for(int i = 0; i < n; i++ )
		{
			printf("%d ", path[i]);
		 } 
		 puts("");
		 return;
	} 
	
	for(int i = 1; i <= n; i++)
	{
		if(!st[i]) // 这个数没用过 
		{
			path[u] = i; // 本层用i这个数
			st[i] = true; 
			dfs(u + 1); // 递归到下一层 
			st[i] = false; 	  // 恢复现场
		}	
	}
} 

int main()
{
	scanf("%d", &n);
	dfs(0);
	return 0;
 } 

时间复杂度

参考文章

posted @ 2022-02-26 09:35  VanHope  阅读(67)  评论(0编辑  收藏  举报