全排列
#include<bits/stdc++.h>
using namespace std;
int n,vis[15],a[15]; //vis用来记录已存入数组中的数
void permutation(int k)
{
if(k-1==n) //k表示当前填写第几格,所以要后退一格
{
for(int i=1;i<=n;i++)
printf("%5d",a[i]);
printf("\n");
return ;
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
vis[i]=1;
a[k]=i;
permutation(k+1);
vis[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
permutation(1); //从第一格开始。
return 0;
}
代码整体思路:全排列一定是从小到大,所以只需要从1到n依次查找填入即可,每进入一次递归,循环都会从1~n查询未被填入的数字,填入数字即进入下一次递归,若递归中数组被填满(k-1=n),则输出序列,且从k-1格向前回溯,一直到i!=n的递归中,回溯当前格停止。

浙公网安备 33010602011771号