dfs-全排列

来源:互联网 发布:意大利签证 知乎 编辑:程序博客网 时间:2024/05/24 15:36

要求:输入一个为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; }

                 

0 0