dfs(深度优先搜索算法)的一些总结

dfs解决全排列问题

解决思路: 每个数字如果访问了,就标记一下,之后,对剩余没有访问的数字再次进行访问,之后,再对该数字取消标记,以便让数字得到访问

数字的全排列的函数如下所示:

class Node
    {
        int num = 0;
        boolean outHand = false;
    }
    List nodeList =  new ArrayList<>();
    List lists = new ArrayList<>();
    int total = 0;
    void dfs(int step, int n)
    {
        if (step == n )
        {

            for (int i = 0; i < n; i++)
            {
                System.out.print(nodeList.get(i).num);
            }
            total++;
            System.out.println();
            return;
        }
        for (int i = 0; i < n; i++)
        {
            if (nodeList.get(i).outHand == false)
            {
                nodeList.get(step).num = i;
                nodeList.get(i).outHand = true;
                dfs(step + 1, n);
                nodeList.get(i).outHand = false;
            }
        }

        return;
    }

    public Node inner()
    {
        return new Node();
    }

组合

组合的话,其实加上一个过滤条件,就是当前的顺序要大于上一次的顺序即可,字符串的组合函数如下所示

/**
     * @Author miaoxu
     * @Description
     * 字符串组合函数
     * @Date 23:05 2018/9/4
     * @Param [num 总数中选择几个数字, tem 临时字符串, res 结果所存的字符集, step, n, flag, string, last 上一次抽取的字符串的位置]
     * @return void
     **/
    public void dfs_strCom(int num,String tem, List res, int step, int n, boolean[] flag, String string, int last)
    {
        if (step == num)
        {
            res.add(tem);
            return;
        }
        for (int i = 0; i < string.length(); i++)
        {
            if (flag[i] == false && i > last)
            {
                flag[i] = true;
                dfs_strCom(num,tem +string.charAt(i), res, step + 1,n, flag, string, i);
                flag[i] = false;
            }
        }
    }

网上的dfs的思路模板

bool check() {
    if(满足条件) {
        return true;
    }
    return false;
}

void dfs(int step) {
    判断边界条件(找到||找完) {
        结束    
    }

    {
        判断所有的可能性
        满足check的条件
        标记
        继续进行下一步(step+1)
        去掉标记(即回溯)
    }
}

你可能感兴趣的:(算法)