C++算法题 # 34 排列数字(深度遍历)

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

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

输入格式
共一行,包含一个整数 n n n

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

数据范围
1 ≤ n ≤ 7 1≤n≤7 1n7
输入样例:

3

输出样例:

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

思路
模板题,很容易理解。

代码示例

#include 


using namespace std;

const int N = 7 + 2;// 扩大点 防止边界问题
int n, path[N];
bool st[N]; // 判断某个数x是否被使用

void dfs(int x)
{
	if (x == n+ 1)// 如果x == n表示所有的数都遍历完了 递归的跳出条件
	{
		for(int i = 1; i <= n; i ++) cout << path[i] << ' ';
		cout << endl;
		return;
	}
	for(int i = 1; i <= n; i ++)
	{
		if ( !st[i] )
		{
			path[x] = i;
			st[i] = true;
			dfs(x + 1);// 继续递归遍历下一个数字
			st[i] = false; // 恢复现场
		}
		
	}

}

int main()
{
	cin >> n;
	dfs(1);
	return 0;

}

你可能感兴趣的:(数据结构与算法,算法,c++,深度优先)