第一招:深度优先搜索
#include <stdio.h>
int a[10],book[10],n;
void dfs(int tnt)
{
int i;
if(tnt==n+1)
{
for(i=1;i<=n;i++)//输出一种排列
printf("%d ",a[i]);
printf("\n");
return;
}
for(i=1;i<=n;i++)
{
if(book[i]==0)
{
a[tnt]=i;
book[i]=1;
//book[i]=0;
dfs(tnt+1);
book[i]=0;//回溯还原,为下一次排列作准备
}
}
return;
}
int main()
{
int i;
scanf("%d",&n);
int count=1;
for(i=1;i<=n;i++)
count*=i;
printf("%d\n",count);//计算种数
dfs(1);//从1号开始深搜
return 0;
}
第二招:对于每个排列逐个交换
#include <stdio.h>
void swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
void sort(int a[], int begin, int end)
{
int i;
if (begin >= end) // 找到一个排列
{
for (i = 0; i < end; i++)
printf("%d ", a[i]);
printf("\n");
}
else// 没有找完一个排列,则继续往下找下一个元素
{
for (i = begin; i < end; i++)
{
if (begin != i)
swap(&a[begin], &a[i]); // 交换
sort(a, begin + 1, end);
if (begin != i)
swap(&a[begin], &a[i]); // 回溯时还原
}
}
}
int main()
{
int a[10];
int i,n,sum;
scanf("%d", &n);
// 初始化数组
for (i = 0; i < n; i++)
a[i] = i + 1;
sum=1;
for (i = 1; i <= n; i++)
sum*=i;
printf("%d\n",sum);
sort(a, 0, n);
return 0;
}
组合输出:n个整数取m个数的组合
#include <stdio.h>
int n,m,a[30];
void dfs(int k)
{
int i;
if(k>m)
{
for(i=1;i<=m;i++)
printf(i==1?"%d":" %d",a[i]);
printf("\n");
return;
}
for(i=a[k-1]+1;i<=n;i++)
{
a[k]=i;
dfs(k+1);
}
}
int main()
{
scanf("%d%d",&n,&m);
dfs(1);
return 0;
}
/*
3 2
1 2
1 3
2 3
*/