zoukankan      html  css  js  c++  java
  • [Locked] Walls and Gates

    Walls and Gates 

    You are given a m x n 2D grid initialized with these three possible values.

    1. -1 - A wall or an obstacle.
    2. 0 - A gate.
    3. INF - Infinity means an empty room. We use the value 231 - 1 = 2147483647 to represent INF as you may assume that the distance to a gate is less than 2147483647.

    Fill each empty room with the distance to its nearest gate. If it is impossible to reach a gate, it should be filled with INF.

    For example, given the 2D grid:

    INF  -1  0  INF
    INF INF INF  -1
    INF  -1 INF  -1
      0  -1 INF INF

    After running your function, the 2D grid should be:

      3  -1   0   1
      2   2   1  -1
      1  -1   2  -1
      0  -1   3   4

    分析:

      深搜DFS即可,注意剪枝,注意overflow

    代码:

    //深搜,三种情况return: 房间编号已经比当前距离小的,墙和门,访问过的,而这三种情况可以用一个式子表示grids[i][j] < dist
    void dfs(vector<vector<int> > &grids, int dist, int i, int j) {
        if(grids[i][j] < dist)
            return;
        grids[i][j] = dist;
        dfs(grids, dist + 1, i, j + 1);
        dfs(grids, dist + 1, i + 1, j);
        dfs(grids, dist + 1, i, j - 1);
        dfs(grids, dist + 1, i - 1, j);
        return;
    }
    void distanceFromGate(vector<vector<int> > &grids) {
        if(grids.empty())
            return;
        //设立边界岗哨
        grids.insert(grids.begin(), vector<int> (grids[0].size(), -1));
        grids.push_back(vector<int> (grids[0].size(), -1));
        for(auto &row : grids) {
            row.insert(row.begin(), -1);
            row.push_back(-1);
        }
        //从每个0开始进行递归
        for(int i = 0; i < grids.size(); i++)
            for(int j = 0; j < grids[0].size(); j++)
                if(grids[i][j] == 0)
                   dfs(grids, 0, i, j);
        //除去边界岗哨
        grids.erase(grids.begin());
        grids.pop_back();
        for(auto &row : grids) {
            row.erase(row.begin());
            row.pop_back();
        }
        return;
    }
  • 相关阅读:
    php分享三十:php版本选择
    php分享二十九:命名空间
    高性能mysql读书笔记(一):Schema与数据类型优化
    php分享二十八:mysql运行中的问题排查
    php分享二十七:批量插入mysql
    php分享二十六:读写日志
    Python | 一行命令生成动态二维码
    Python-获取法定节假日
    GoLang-字符串
    基础知识
  • 原文地址:https://www.cnblogs.com/littletail/p/5208063.html
Copyright © 2011-2022 走看看