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