1. 程式人生 > >leetcode:0-1 矩陣問題

leetcode:0-1 矩陣問題

//DFS (Time Limited)
class Solution {
public:
    int dfs(vector<vector<int>> &matrix,int i,int j,int R,int C,bool** visited){
        int res=R+C;

        if (0==matrix[i][j]) return 0;

        visited[i][j]=true;

        if (j>0&&!visited[i][j-1]){//left
            res=min(res,1
+dfs(matrix,i,j-1,R,C,visited)); } if (j<C-1&&!visited[i][j+1]){//right res=min(res,1+dfs(matrix,i,j+1,R,C,visited)); } if (i>0&&!visited[i-1][j]){//up res=min(res,1+dfs(matrix,i-1,j,R,C,visited)); } if (i<R-1
&&!visited[i+1][j]){//down res=min(res,1+dfs(matrix,i+1,j,R,C,visited)); } visited[i][j]=false; return res; } vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { int R=matrix.size(),C=matrix[0].size(); vector
<vector<int>>
ret(R,vector<int>(C,0)); bool **visited=new bool *[R]; for (int i=0;i<R;i++){ visited[i]=new bool [C]; fill(visited[i],visited[i]+C,false); } for (int i=0;i<R;i++){ for (int j=0;j<C;j++){ ret[i][j]=dfs(matrix,i,j,R,C,visited); } } delete [] visited; return ret; } };
//BFS
class Solution {
public:
    //BFS 只進入合法節點
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int R=matrix.size(),C=matrix[0].size();
        queue<pair<int,int>> q;
        vector<pair<int,int>> adjust={{0,-1},{0,1},{-1,0},{1,0}};
        for (int i=0;i<R;i++){
            for (int j=0;j<C;j++){
                if (0==matrix[i][j]) q.push({i,j});
                else matrix[i][j]=INT_MAX;
            }
        }

        while(!q.empty()){
            pair<int,int> coordinate=q.front();
            q.pop();

            int i=coordinate.first,j=coordinate.second;

            for (auto d:adjust){

                auto x=i+d.first,y=j+d.second;
                if(x>=0 && x<R && y>=0 && y<C){
                    if (matrix[x][y]>=matrix[i][j]+1){//careful
                        matrix[x][y]=1+matrix[i][j];
                        q.push({x,y});
                    } 
                }
            }
        }
        return matrix;
    }
};