天天看点

94. 递归实现排列型枚举

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

输入格式

一个整数 nn。

输出格式

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

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

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

数据范围

1≤n≤91≤n≤9

输入样例:

3
           

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
           
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int N = 10;
int n;
int sta[N];   //用来存数
bool us[N];  //判断第i位数是否使用

void dfs(int u)   //u表示判断sta数组第u位存什么数
{
	if (u > n)//边界 已全部赋值完毕
	{
		for (int i = 1; i <= n; i++)
		{
			printf("%d ", sta[i]);
		}
		puts(" ");
		return;
	}
	
	
	for(int i=1;i<=n;i++)
	{ 
		//此时的每一位数是空 false
		if (!us[i] )   //循环 使得每都是未存个i放数列中的最小位
		{
			sta[u] = i;        //将数i存到下标位u的位置上,0表示不放
			us[i] = true;    //将数i标记为已使用过
			dfs(u + 1);      //进行下一位的判断
			//恢复现场
			sta[u] = 0;
			us[i] = false;
		}
	}

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

继续阅读