标签:
1 #include <stdio.h>
2 /*
3 输入一个数n,输出1~n的全排列,有多少种不同的排列?
4 //暴力枚举当然可以,写判断累死.for循环嵌套起来也是累.
5
6 这里运用的是depth first search,DFS 深度优先搜索的思想
7 装作n对应的是n张扑克牌,将其放入n个盒子里有多少种排列方法.
8 */
9 int a[10],book[10],n;//c语言的全局变量在没有赋值以前默认为0;因此哲理的book数组无需全部再次赋初始值0;
11 void dfs(int step)//step表示现在站在第几个盒子面前
12 {
13 int i;
14 if(step==n+1)//如果站在第n+1个盒子面前
15 {
16 //输出一种排列(1~n号盒子中的扑克牌编号)
17 for(i=1;i<=n;i++)
18 printf("%d ",a[i]);
19
20 printf("\n");
21
22 return;//返回之前的一步(最近一次调用dfs函数的地方)
23 }
24
25 //此时站在第step个盒子面前.应该放哪张牌?
26 //按照1,2,3,4,5......n的顺序一一尝试
27 for(i=1;i<=n;i++)
28 {
29 //判断扑克牌i是否在手上
30 if(book[i]==0) //book [i] ==0 表示i号扑克牌在手上
31 {
32 //开始尝试使用扑克牌i
33 a[step]=i;//将i号扑克牌放入到第step个盒子里
34 book[i]=1;//将book[i]设定为1,表示i号扑克牌已经不在手上了.
35
36 //第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前
37 dfs(step+1);//这里通过函数的递归调用来实现(自己调用自己)
38 book[i]=0;//这是非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试.
39
40 }
41
42 }
43
44 return;
45 }
46
47 int main()
48 {
49 scanf("%d",&n);//输入的时候要注意n为1~9之间的整数.毕竟book[10]和a[10]并没有提供给无限.
50 dfs(1);//首先站在1号小盒子面前
51 getchar();
52
53 getchar();
54 return 0;
55 }
运行举例:/**/中是注释
$ ./dfs /*运行程序*/
4 /*赋值给n*/
/*输出结果:*/
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
标签:
原文地址:http://www.cnblogs.com/zanglie/p/4555858.html