墙和门

江枫思渺然 提交于 2019-11-30 06:08:19

您将获得一个使用这三个可能值初始化的 m×n 2D 网格。
-1 - 墙壁或障碍物。
0 - 门。
INF - Infinity是一个空房间。我们使用值 2 ^ 31 - 1 = 2147483647 来表示INF,您可以假设到门的距离小于 2147483647
在代表每个空房间的网格中填入到距离最近门的距离。如果不可能到达门口,则应填入 INF

样例

样例1

输入:
[[2147483647,-1,0,2147483647],[2147483647,2147483647,2147483647,-1],[2147483647,-1,2147483647,-1],[0,-1,2147483647,2147483647]]
输出:
[[3,-1,0,1],[2,2,1,-1],[1,-1,2,-1],[0,-1,3,4]]
解释:
2D网络为:
INF  -1  0  INF
INF INF INF  -1
INF  -1 INF  -1
  0  -1 INF INF
答案为:
  3  -1   0   1
  2   2   1  -1
  1  -1   2  -1
  0  -1   3   4

样例2

输入:
[[0,-1],[2147483647,2147483647]]
输出:
[[0,-1],[1,2]]

 

class Solution {
public:
    /**
     * @param rooms: m x n 2D grid
     * @return: nothing
     */
    int m;
    int n;
    void wallsAndGates(vector<vector<int>> &rooms) {
        // write your code here
        m = rooms.size();
        n = rooms[0].size();
        for(int i = 0; i < m; i++)
            for(int j = 0; j < rooms[i].size(); j++)
            {
                if(rooms[i][j] == 2147483647)
                {
                    int res = INT_MAX;
                    dfs(rooms,i,j,0,res);
                    if(res == INT_MAX)
                    {
                        
                    }
                    else
                    {
                        rooms[i][j] = res;
                    }
                }
            }
    }
    
    void dfs(vector<vector<int>> &rooms, int x, int y, int step, int& res)
    {
        if(!isarea(x,y))
            return;
        
        if(rooms[x][y] == 0)
        {
            res = min(res, step);
            return;
        }
        
        if(rooms[x][y] <  0)
            return;
        int copy = rooms[x][y];
        rooms[x][y] = -2;
        dfs(rooms,x-1,y,step+1,res);
        dfs(rooms,x,y+1,step+1,res);
        dfs(rooms,x+1,y,step+1,res);
        dfs(rooms,x,y-1,step+1,res);
        rooms[x][y] = copy;
    }
    
    bool isarea(int x , int y)
    {
        if(x < 0 || y < 0 || x >= m || y >= n)
            return false;
        return true;
    }
};

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!