要求:输入一个为n的数,输出1~n的全排列。
解法:本题可以用多重循环来做,但是过于繁琐;但本题是一个典型的dfs问题,我们可以构造n个盒子,1~n个数看成n张卡片,我们需要做的就是如何将这n张卡片放入n个盒子中,且可以有多少种不同的放法,我们假定每个盒子中的卡片都是按照顺序的顺序放置,以n=3为例,在第一个盒子里,我们按照1~3的顺序放置一张1;在第二个盒子里也是如此,但此时我们手中还剩下2和3,故放入2;同理第三个盒子里放3。此时第一轮放法结束,接下来我们拿出第三个盒子里的3,因为是按照1~3的顺序来放置,所以无法在放入3,
我们将卡片拿在手上,来到第二个盒子并拿出里面的卡片 ,此时我们手中有2和3两张卡片,而对于第二个盒子,我们之前已近放过2,故按照顺序,只能放入3,这时候我们再次来到第三个盒子,将第2放入,形成新的放法132,同理可得余下所有的放法。具体代码如下:
#include<stdio.h>
int a[10], book[10], n;
void dfs(int step)
{
int i;
if (step == n + 1)//第一轮所有盒子中都放满了卡片,输出
{
for (i = 1; i <= n; i++)
printf("%d",a[i]);
printf("\n");
return;
}
for (i = 1; i <= n; i++)//对于第step个盒子,可放入1-n中任意的卡片,故用循环表示
{
if (book[i] == 0)
{
a[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0;//将尝试的卡片收回
}
}
return;
}
int main()
{
scanf("%d",&n);
dfs(1);
getchar(); getchar();
return 0;
}