问题:输入一个数字n,输出1-n的全排列。
思路:如果n比较小的话(像1,2,3这种)直接用for循环就好了,但是循环层越多,时间复杂度也越大,所以这个时候输入的n大了肯定超时。
用新的方法(DFS),比如要输出3的全排列
你现在手里有3张扑克牌,分别编号1、2、3,要将这三张扑克牌分别放到三个箱子里,箱子编号分别为1、2、3
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
#include<set>
#include<map>
using namespace std;
int n;
int a[1005],book[1005];
void dfs(int step) //step表示你现在走到第step个箱子前面来放扑克了
{
int i;
if(step==n+1) //如果你现在已经把前n个箱子放完了,现在走到第n+1个箱子前面,发现你手里没有扑克了,放不了了,就开始输出前n个箱子的扑克号
{
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
return ;
}
for(i=1;i<=n;i++)
{
if(book[i]==0) //判断这个箱子是否可以访问,为0说明这个箱子没有放扑克,可以访问
{
a[step]=i; //把第i张扑克放进第step个箱子里
book[i]=1; //放完之后把这个箱子标记为不可访问
dfs(step+1); //对下一个箱子放扑克
book[i]=0; //将刚才尝试的扑克收回,才能进行下一次尝试
}
}
return ;
}
int main()
{
scanf("%d",&n);
dfs(1); //首先站在1号箱子前,进行放扑克
return 0;
}