leetcode:542. 01 矩阵(深搜)----多源的dfs

题目:

leetcode:542. 01 矩阵(深搜)----多源的dfs_第1张图片

分析:

本来想套用康熙雍正乾隆滑雪问题的思路,失败了。
看题解,多源的dfs问题。

我最初的垃圾代码:

int f(vector<vector<int>>  m,vector<vector<int>> &n,int i,int j,int x,int y)
{
 if(i==-1||i==x||j==-1||y==j) return 1<<30;
 if(n[i][j]) return m[i][j];
 if(m[i][j]==0) return 0;
 n[i][j]=1+min(min(f(m,n,i-1,j,x,y),f(m,n,i+1,j,x,y)),min(f(m,n,i,j-1,x,y),f(m,n,i,j+1,x,y)));
 return n[i][j];
}
int main()
{
 vector<vector<int>>  m;
 //原始 
 if(m.size()==0) return m;
 vector<vector<int>> n=m;
 //存放值  初始化为0 
 for(int i=0;i<m.size();i++)
 {
  for(int j=0;j<m[0].size();j++)
  {
   n[i][j]=0; 
  }
  } 
 
 for(int i=0;i<m.size();i++)
 {
  for(int j=0;j<m[0].size();j++)
  {
   if(m[i][j]==0) continue;
   if(n[i][j]) continue;
   n[i][j]=f(m,n,i,j,m.size(),m[0].size());
  }
  } 
 return n;  
 }

题解多源头dfs思路的代码:

void f(int i,int j,int depth,vector<vector<int> > m)
{
 if(i==-1||i==m.size()||j==-1||m[0].size()==j) return;
 if(depth>=m[i][j]) return;
 int x=i,y=j;
 m[x][y]= depth;
 f(x+1, y, depth+1, m);
 f(x-1, y, depth+1, m);
 f(x, y+1, depth+1, m);
 f(x, y-1, depth+1, m);
}
int main()
{
 vector<vector<int> > m;
 if(m.size()==0) return m;
 int x=m.size();
 int y=m[0].size();
 //如果他的四周都不是0,则设为无穷大
 for(int i=0;i<x;i++)
 {
  for(int j=0;j<y;j++)
  {
   if(m[i][j]!=0&& !((i-1 > -1 && m[i - 1][j] == 0)
                        || (i+1 < x && m[i + 1][j] == 0)
                        || (j-1 > -1 && m[i][j - 1] == 0)
                        || (j+1 < y && m[i][j + 1] == 0)))
                        {
                         m[i][j]=1<<30;
      }
  }
 }
  for (int i = 0; i < x; i++){
   for (int j = 0; j < y; j++)
   {
    if(m[i][j]==0)
    f(i,j,0,m);
   }
  }
}

结果:

leetcode:542. 01 矩阵(深搜)----多源的dfs_第2张图片

你可能感兴趣的:(深搜,我认为的精华)