数据结构+算法(搜索类:BFS + DFS )

BFS

典型搜索树示意图

数据结构+算法(搜索类:BFS + DFS )

// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
    std::queue<Node> q; // 核心数据结构
    std::set<Node> visited; // 避免走回头路
    
    q.push(start); // 将起点加入队列
    visited.insert(start);
    int step = 0; // 记录扩散的步数

    while (!q.empty()) {
        int sz = q.size();
        /* 将当前队列中的所有节点向四周扩散 */
        for (int i = 0; i < sz; i++) {
            auto cur = q.front();
          	q.pop();
            /* 划重点:这里判断是否到达终点 */
            if (cur is target)
                return step;
            /* 将 cur 的相邻节点加入队列 */
            for (Node x : cur.adj()) {
                if (visited.count(x) < 0) {
                    q.push(x);
                    visited.insert(x);
                }
            }
        }
        /* 划重点:更新步数在这里 */
        step++;
    }
}

 

DFS

决策树

数据结构+算法(搜索类:BFS + DFS )

 

/*
*@param: origin_source 一般是给定的输入
*@param: track_res 期望的最终结果
*@param: single_track 期望目标结果中的单个case
*@param: cur_index 当前执行的阶段
*/
void backtrack(DataType origin_source, vector<DataType> track_res, DataType& single_track,int cur_index) {
    // 触发结束条件。这里用cur_index 或者single_track 的内容做判断均可
    if (cur_index == 边界条件) { 
        track_res.push_back(single_track);
        return;
    }
    
    for (int i = 0; i < origin_source.size(); i++) {
        // 排除不合法的选择
        if (isValid())
            continue;
        // 做选择,将当前选择加入
        single_track.push(origin_source[i]);
        // 进入下一层决策树
        backtrack(origin_source, track_res, singhle_track, cur_index++);
        // 取消选择
        single_track.pop();
    }
}
上一篇:Photoshop将偏红色宝宝照片美白处理


下一篇:winform 实现两个datagridview之间的数据联动