搜索——DFS(深度优先搜索)

深度优先搜索就是从一个分治走到底,

 

【例题1】给定一个 n 个结点的无向图,要求从 0 号结点出发遍历整个图,求输出整个过程的遍历序列。其中,遍历规则为:
1)如果和 当前结点 相邻的结点已经访问过,则不能再访问;
2)每次从和 当前结点 相邻的结点中寻找一个编号最小的没有访问的结点进行访问;

  • 如图1所示,对上图以深度优先的方式进行遍历,起点是 0;
  • <1> 第一步,当前结点为 0,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 1;
  • <2> 第二步,当前结点为 1,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 3;
  • <3> 第三步,当前结点为 3,标记已访问,没有尚未访问的相邻结点,执行回溯,回到结点 1;
  • <4> 第四步,当前结点为 1,从相邻结点中找到编号最小的且没有访问的结点 4;
  • <5> 第五步,当前结点为 4,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 5;
  • <6> 第六步,当前结点为 5,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 2;
  • <7> 第七步,当前结点为 2,标记已访问,然后从相邻结点中找到编号最小的且没有访问的结点 6;
  • <8> 第八步,当前结点为 6,标记已访问,没有尚未访问的相邻结点,执行回溯,回到结点 2;
  • <9> 第九步,按照 2 => 5 => 4 => 1 => 0 的顺序一路回溯,搜索结束;

案例2,用DFS全排列,输入一个n然后进行排列(1~n)

例如:

 输入:3

结果:
123
132
213
231
312
321

代码:

package 备赛课.搜索;

import java.util.Scanner;

public class dfs搜索 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        dfs(0, "", sc.nextInt());
    }

    //depth用来记录深度
    static void dfs(int depth, String ans, int len) {

        if (depth == len) {//出口
            System.out.println(ans);
            return;
        }
        for (int i = 1; i <= len; i++) {
            if (!ans.contains(i + "")) {//看是否有重复的,如果没有重复的继续递归
                dfs(depth + 1, ans + i, len);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值