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;
    }
  • 相关阅读:
    VIM中去除Windows文本中的^M符号,多种方法
    LAMP=LINUX+Apache+MySQL+PHP
    个人常用的VIM命令列表
    vim与windows/linux之间的复制粘贴小结
    eclipse中安装vim插件
    关闭VIM/VI自动备份
    linux一些个非官方网站
    程序员的编辑器
    linux和windows双系统互拷文件乱码问题
    Linux ubuntu lamp安装配置环境phpmyadmin
  • 原文地址:https://www.cnblogs.com/littletail/p/5208063.html
Copyright © 2011-2022 走看看