深度优先搜索--从1到n数字的所有排列

本文探讨了如何使用深度优先搜索(DFS)算法来生成1到n的所有数字排列。通过将数字比作扑克牌并存入盒子中,阐述了DFS的关键在于递归地处理每个步骤,尝试所有可能的选择。借助于《啊哈!算法》一书中的例子,深入浅出地解释了DFS的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把数字当做扑克牌按照一定顺序依次放到盒子内。

public class DfsTest {
    //深度优先遍历,  求从1到n的所有数字排列
    static int a [] = new int[10];
    static int book [] = new int[10];//book中的值为标记用,初始值设置为0,为扑克牌在手上时
    static int n = 3;//几个数字的全排列n
    static int sum = 0;
    static {
        //为a和book数组赋值
        for (int j = 1; j <= n; j ++){
            a[j] = j;
            book[j] = 0;
        }
    }

    public static void main(String[] args) {
        DfsTest test = new DfsTest();
        test.dfs(1);
    }

    public  void dfs(int step){//step 为目前站在第几个盒子面前
        System.out.println(step+","+n);
        int i;
        if(step == n + 1){//如果站在n+1盒前,表示前n个盒子已经放好
            for (i = 1; i <= n; i ++){
                System.out.print(a[i]);
            }
            sum++;
            System.out.println("here"+sum);
            return;
        }
        //此时站在第step个盒子面前,应该放哪张牌呢?
        //按照1,2,3,,,n的顺序一一尝试
        for (i = 1; i <= n; i ++){
            //判断扑克牌是否在手
            if(book[i] == 0){// 0 表示在手
                //开始尝试使用扑克牌
                a[step] = i;//将i号放入第step个盒子中
                book[i] = 1;// 1 表示不在手
                //第step个盒子已放好扑克,接下来就走到下一个盒子面前
                dfs(step + 1); //递归
                book[i] = 0; // 最重要的,,尝试过的扑克收回,才可进行下一次
            }
        }
        return;
    }
}

理解深度优先搜索的关键在于“当下该如何做”,至于“下一步如何做”和“当下如何做”是一样的。比如这里写的dfs(step)函数的主要功能就是解决当你在第step个盒子的时候该怎么办,通常的方法就是把每种可能都试一遍(for循环遍历),当前这一步解决后便进入下一步dfs(step+1)。下一步的解决方法和当前这步的解决方法是完全一样的。

void dfs(int step){
    判断边界
    //尝试每种可能
    for(i = 1; i <= n; i ++){
        //继续下一步
        dfs(step+1);
    }
    返回
}

本文借鉴来自《啊哈!算法》,感谢作者啊哈磊的生动讲解!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值