隐藏
Single

图论基础:DFS和BFS

深度优先搜索(DFS)

因为dfs搜索是一个方向,并需要回溯,所以用递归的方式来实现,而有递归的地方就有回溯。

void dfs(参数) {
    if (终止条件) {
        存放结果;
        return;
    }

    for (选择:本节点所连接的其他节点) {
        处理节点;
        dfs(图,选择的节点); // 递归
        回溯,撤销处理结果
    }
}

总体代码:

    int dir[4][2] = {{0, 1},   // 右

                     {1, 0},   // 下

                     {-1, 0},  // 上

                     {0, -1}}; // 左

    void dfs(const vector<vector<char>>& grid, vector<vector<bool>>& visited,

             int x, int y) {

        if (visited[x][y] || grid[x][y] == '0')

            return;

        visited[x][y] = true;

        for (int i = 0; i < 4; i++) {

            int nextx = x + dir[i][0];

            int nexty = y + dir[i][1];

            if (nextx < 0 || nextx >= grid.size() || nexty < 0 ||

                nexty >= grid[0].size()) {

                continue;

            }

            dfs(grid, visited, nextx, nexty);

        }

    }

广度优先搜索(BFS)

广搜的搜索方式就适合于解决两个点之间的最短路径问题。

因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。

总体代码:

int dir[4][2] = {{0, 1},   // 右

                     {1, 0},   // 下

                     {-1, 0},  // 上

                     {0, -1}}; // 左

    void bfs(const vector<vector<char>>& grid, vector<vector<bool>>& visited,

             int x, int y) {

        queue<pair<int, int>> que;

        que.push({x, y});//起始节点加入队列

        visited[x][y] = true; // 只要加入队列,立刻标记

        while (!que.empty()) {

            //从队列中取元素

            pair<int, int> cur = que.front();

            que.pop();

            int curx = cur.first;

            int cury = cur.second;

           

            for (int i = 0; i < 4; i++) {

                int nextx = curx + dir[i][0];

                int nexty = cury + dir[i][1];

                if (nextx < 0 || nextx >= grid.size() || nexty < 0 ||

                    nexty >= grid[0].size())

                    continue; // 越界了,直接跳过

                if (!visited[nextx][nexty] && grid[nextx][nexty] == '1') {

                    que.push({nextx, nexty});

                    visited[nextx][nexty] = true; // 只要加入队列立刻标记

                }

            }

        }

    }

 

暂无评论

发表评论

HTMLCOPY