两种全排列
方法相近,都是设置标记,然后递归,判断边界,递归。
/* 1~n中选m个数字进行全排列 */
#include <stdio.h>
void PrintPerm(int *a,int n,int m ,int cur);
int main ()
{
int n,m,a[100];
printf("input n: \n");scanf("%d",&n);
printf("input m: \n");scanf("%d",&m);
PrintPerm(a,n,m,0);
return 0;
}
void PrintPerm(int *a,int n,int m,int cur )
{
int i,j ;
if(cur == m)
{
for(i = 0 ; i < m ; i++)
{
printf("%d", a[i]);
}
printf("\n");
}
else
{
for(i = 1 ; i <= n ;i++) //依次从1~n中取一个数给a[cur]
{
int ok = 1 ;
for(j = 0 ; j < cur && ok ;j++)
if(a[j] == i)
ok = 0; //i已经出现过
if(ok) //未出现过
{
a[cur] = i;
PrintPerm(a,n,m,cur+1);
}
}
}
}
/* 全排列 */
#include <stdio.h>
#include <stdlib.h>
int used[1000];
int a[1000]; //全局变量的默认值是0
void dfs(int cur,int end,int n)
{
int i;
if(cur==end+1)
{
for(i=1;i<=end;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
for(i=1;i<=n;i++)
{
if(!used[i])
{
a[cur]=i;
used[i]=1;
dfs(cur+1,end,n);
used[i]=0;
}
}
}
int main() {
int k;
scanf("%d",&k);
while(k--)
{
int n,m,i,j;
scanf("%d%d",&n,&m);
dfs(1,m,n);
}
return 0;
}