码迷,mamicode.com
首页 > 编程语言 > 详细

c语言 深度优先 DFS

时间:2015-06-06 01:36:54      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

 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

 

c语言 深度优先 DFS

标签:

原文地址:http://www.cnblogs.com/zanglie/p/4555858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!