leetcode:0-1 矩陣問題
阿新 • • 發佈:2018-12-31
//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;
}
};