搜索
查看: 745|回复: 2
打印 上一主题 下一主题

深度优先搜索的顺序问题

[复制链接]
跳转到指定楼层
楼主
发表于 2016-2-1 16:01:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
先上代码
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int a[10],book[10],n;//C语言的全局变量在没有赋值以前默认为0,因此这里的book数组无需全部再次赋值为0
void dfs(int step)//step表示现在站在第几个盒子面前
{
        int i;
        if(step==n+1)//如果站在第n+1个盒子面前,表示前n个盒子已经放好了扑克牌     这里假设n为3那么  1==3+1不成立跳到下面for循环那
        {
                //输出一种排列(1-n号盒子中的扑克牌编号)
                for(i=1;i<=n;i++)
                        printf("%d",a);
                printf("\n");
               
                return;//返回之前的一步(最近一次调用dfs函数的地方)                  
                           //虽说void没有返回值 但是也可以用return只是不能加数字
         }
         //此时占地第step个盒子面前
         //按照1,2,3,...n的顺序一一尝试
         for(i=1;i<=n;i++)
         {
                 //判断扑克牌i是否还在手上
                 if(book==0)//等于0表示i号扑克牌在手上
                 {
                         //开始尝试使扑克牌i
                         a[step]=i;//将i号扑克牌放入到第step个盒子中
                         book=1; //将book设为1,表示i号扑克牌已经不再手上
                        
                         //第step个盒子已经放好扑克牌,接下来需要走到下一个盒子面前
                         dfs(step+1);//这里通过函数的递归调用来实现(自己调用自己)
                         book=0;//这是非常重要的一步,一定要将刚才尝试的扑克牌收回,才能进行下一次尝试
                  }
         }
         return;
}
int main()
{
         scanf("%d",&n);//输入的时候要注意n为1-9之间的整数        
         dfs(1);//首先站在1号小盒子面前
         system("pause");
         return 0;
}[/mw_shl_code]


假如输入的n是3 那么顺序就应该是

if(1==3+1)不成立
for(i=1;i<=3;i++)
if(book[1]==0)成立
a[1]=1;
book[1]=1;
dfs(2)
然后
if(2==3+1)不成立
依次类推

重点来了

dfs(4)时
if(4==3+1)成立
打印123    换行

return;         返回到之间的一步
(下面就是我自己理解的顺序)
dfs(3+1)
然后
book[3]=0;
然后后面我就不知道是怎么循环到把book[2]=0;


大概操作是打印123 收回23 打印132


望各位 指点   


上面的循环顺序全部是自己理解的   如果有错误请指正





QQ截图20160201160031.png (6.88 KB, 下载次数: 9)

QQ截图20160201160031.png
沙发
 楼主| 发表于 2016-2-1 19:57:48 | 只看该作者
没人么?
板凳
 楼主| 发表于 2016-2-2 12:39:12 | 只看该作者
快沉了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表