法一:
#include<stdio.h>
int a[10], book[10], n; //此处说明一下,C语言的全局变量自动初始化为0
//这里的book数组无需全部再次初始化
void dfs(int step) //step表示现在站在第几个盒子面前
{
int i;
if(step == n + 1)
{
//输出一种排列(1-n号盒子中的扑克牌编号)
for(i = 1; i <= n; i++)
{
printf("%d%c", a[i], i == n?'\n':',');
}
return ; // 返回之前的一步, 最近调用dfs的函数的地方
}
//此时站在第step个盒子面前,应该放那张牌呢?
//按照1,2,3···n的顺序一一尝试
for(i = 1; i <= n; i++)
{
//判断扑克牌i是否还在手上
if(book[i] == 0) //book[i]等于0表示i号扑克牌在手里
{
//开始尝试使用扑克牌i
a[step] = i; //将i号扑克牌放入第step个盒子中
book[i] = 1; //将book[i]设为1,表示此时不在手中
//第step个盒子已经放好扑克牌,接下来需要放第step+1个盒子
dfs(step + 1); //这里通过函数的递归调用来实现(自己调用自己)
book[i] = 0; //这是非常重要的一步,一定要将刚才尝试的扑克牌收走
//才能进行下一次尝试
}
}
return ;
}
int main(void)
{
scanf("%d", &n);
dfs(1); //首先站在1号小盒子面前
return 0;
}
法二:
#include<stdio.h>
void swap(int *p, int *q)
{
int temp = *p;
*p = *q;
*q = temp;
}
void perm(int a[], int k, int m)
{
int i;
if(k == m)
{
for(i = 1; i <= m; i++)
{
printf("%d%c", a[i], i == m?'\n':',');
}
}
else
{
for(i = k; i <= m; i++)
{
swap(&a[k], &a[i]);
perm(a, k + 1, m);
swap(&a[k], &a[i]);
}
}
}
int main(void)
{
int t, i, n, a[11];
while(~scanf("%d", &t))
{
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
perm(a, 1, n);
}
return 0;
}