全排列问题

题目大意:输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

这个题我们可以用深搜来解决:每一位在保证不重复的情况下先从1~n中最小的开始;从最后一位开始依次遍历,遍历过的进行标记,防止重复;当一种情况遍历完时,前一位加一,后一位在保证不重复的情况下从1~n中最小的开始;重复过程。

代码如下:

//全排列
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct dbf
{
int data=0;
bool b=0;
};
dbf g[99999];
int t = 0;
void find(int n)
{
if (n > t)
{
for (int i = 1; i <= t; i++)
{
printf("%5d", g[i].data);
}
cout << endl;
return;
}
for (int i = 1; i <= t; i++)
{
if (g[i].b == 0)
{
g[i].b = 1;
g[n].data = i;
find(n + 1);
g[i].b = 0;
}
}
}
int main()
{
cin >> t;
find(1);
return 0;
}