/*
DFS实现全排列
递归是我的弱项
分析递归过程分析的头都大了。。。
做一下注释
免得日后想不起来
运行时注意:
输入数字最好不要超过两位数
输入10时运行时间近1min
产生的output.txt达到惊人的79.6M!!!
*/
#define LOCAL
#include<iostream>
#define N 15
using namespace std;
int n, ans[N], visit[N];
void DFS(int depth)
{
int i, j;
for (i = 1; i <= n; i++) //从1到n对数表扫描一遍
{
if (!visit[i]) //看哪个数字未被访问就访问之
{
visit[i] = 1; //标记为已访问
ans[depth] = i; //将该数字填表
if (depth < n) //如果没有填到n
DFS(depth + 1); //填depth+1
else //如果填表完毕
{
for (j = 1; j <= n; j++) //输出结果
cout << ans[j] << " ";
cout << endl;
}
visit[i] = 0; //访问完毕返回标记为可访问
//注意这一句只有当填表完毕输出了结果后才有可能执行到
//填表完毕表示一个排列已经产生
//该数自然可以恢复自由身继续被访问了
}
}
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
while (cin >> n)
{
memset(visit, 0, sizeof(visit));
DFS(1); //从1开始往后填表
}
return 0;
}