Distanța celei mai apropiate celule având 1 într-o matrice binară

Distanța celei mai apropiate celule având 1 într-o matrice binară
Încercați-l pe GfG Practice

Dat un binar grilă[][] . Găsiți distanța celui mai apropiat 1 în grilă pentru fiecare celulă.
Distanța se calculează ca  |i 1   - i 2 | + |j 1  -j 2 | unde eu 1 j 1  sunt numărul rândului și numărul coloanei celulei curente și i 2 j 2  sunt numărul rândului și numărul coloanei celei mai apropiate celule având valoarea 1. 

Nota: Ar trebui să existe cel puțin o celulă cu valoarea 1 în grilă.

Exemple:



Intrare: grilă[][] = [[0 1 1 0]
[1 1 0 0]
[0 0 1 1]]
Ieșire: [[1 0 0 1]
[0 0 1 1]
[1 1 0 0]]
Explicaţie:
celula (0 1) are cel mai apropiat 1 la celula (0 0) - distanță = |0-0| + |0-1| = 1
celula (0 2) are cel mai apropiat 1 la celula (0 3) - distanță = |0-0| + |3-2| = 1
celula (1 0) are cel mai apropiat 1 la celula (0 0) - distanță = |1-0| + |0-0| = 1
celula (1 1) are cel mai apropiat 1 la celula (1 2) - distanta = |1-1| + |1-2| = 1
celula (2 2) are cel mai apropiat 1 la celula (2 1) - distanta = |2-2| + |2-1| = 1
celula (2 3) are cel mai apropiat 1 la celula (1 3) - distanta = |2-1| + |3-3| = 1
Restul sunt toate celulele cu 1, astfel încât distanța lor față de cel mai apropiat celulă care are 1 este 0.

Intrare: grilă[][] = [[1 0 1]
[1 1 0]
[1 0 0]]
Ieșire: [[0 1 0]
[0 0 1]
[0 1 2]]
Explicaţie:
celula (0 0) are cel mai apropiat 1 la celula (0 1) - distanță = |0-0| + |0-1| = 1
celula (0 2) are cel mai apropiat 1 la celula (0 1) - distanță = |0-0| + |2-1| = 1
celula (1 0) are cel mai apropiat 1 la celula (0 1) - distanta = |1-0| + |0-1| = 2
celula (1 1) are cel mai apropiat 1 la celula (1 2) - distanta = |1-1| + |1-2| = 1
celula (2 0) are cel mai apropiat 1 la celula (2 1) - distanta = |2-2| + |2-1| = 1
celula (2 2) are cel mai apropiat 1 la celula (2 1) - distanta = |2-2| + |2-1| = 1
Restul sunt toate celulele cu 1, astfel încât distanța lor față de cel mai apropiat celulă care are 1 este 0.

Cuprins

[Abordare naivă] - O((n*m)^2) Timp și O(n * m) Spațiu

Ideea este de a parcurge întreaga grilă și de a calcula distanța fiecărei celule până la cel mai apropiat 1:

  • Dacă celula conține 1, distanța sa este 0.
  • Dacă celula conține 0, parcurgem întreaga grilă pentru a găsi cea mai apropiată celulă care conține 1.
  • Pentru fiecare celulă 0 calculați distanța Manhattan până la toate celulele cu 1 și luați distanța minimă.

Stocați această distanță minimă în celula corespunzătoare a matricei rezultate. Repetați pentru toate celulele din grilă.

C++
    //Driver Code Starts   #include         #include          #include         using     namespace     std  ;   //Driver Code Ends      vector   <  vector   <  int  >>     nearest  (  vector   <  vector   <  int  >>     &  grid  )   {      int     n     =     grid  .  size  ();      int     m     =     grid  [  0  ].  size  ();      vector   <  vector   <  int  >>     ans  (  n       vector   <  int  >  (  m       INT_MAX  ));      // visit each cell of the grid      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )      {      // if the cell has 1      // then the distance is 0      if     (  grid  [  i  ][  j  ]     ==     1  )      {      ans  [  i  ][  j  ]     =     0  ;      continue  ;      }      // iterate over all the cells      // and find the distance of the nearest 1      for     (  int     k     =     0  ;     k      <     n  ;     k  ++  )      {      for     (  int     l     =     0  ;     l      <     m  ;     l  ++  )      {      if     (  grid  [  k  ][  l  ]     ==     1  )      {      ans  [  i  ][  j  ]     =     min  (  ans  [  i  ][  j  ]     abs  (  i     -     k  )     +     abs  (  j     -     l  ));      }      }      }      }      }      return     ans  ;   }      //Driver Code Starts   int     main  ()   {      vector   <  vector   <  int  >>     grid     =     {{  0       1       1       0  }     {  1       1       0       0  }     {  0       0       1       1  }};      vector   <  vector   <  int  >>     ans     =     nearest  (  grid  );      for     (  int     i     =     0  ;     i      <     ans  .  size  ();     i  ++  )      {      for     (  int     j     =     0  ;     j      <     ans  [  i  ].  size  ();     j  ++  )      {      cout      < <     ans  [  i  ][  j  ]      < <     ' '  ;      }      cout      < <     endl  ;      }      return     0  ;   }   //Driver Code Ends     Java   
    //Driver Code Starts   import     java.util.ArrayList  ;   class   GFG     {   //Driver Code Ends         static     ArrayList   <  ArrayList   <  Integer  >>  nearest  (  int  [][]     grid  )      {      int     n     =     grid  .  length  ;      int     m     =     grid  [  0  ]  .  length  ;      ArrayList   <  ArrayList   <  Integer  >     >     ans      =     new     ArrayList   <>  ();      // initialize all cells with maximum value      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      ArrayList   <  Integer  >     row     =     new     ArrayList   <>  ();      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      row  .  add  (  Integer  .  MAX_VALUE  );      }      ans  .  add  (  row  );      }      // visit each cell of the grid      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      // if the cell has 1 distance is 0      if     (  grid  [  i  ][  j  ]     ==     1  )     {      ans  .  get  (  i  ).  set  (  j       0  );      continue  ;      }      // iterate over all cells to find nearest 1      for     (  int     k     =     0  ;     k      <     n  ;     k  ++  )     {      for     (  int     l     =     0  ;     l      <     m  ;     l  ++  )     {      if     (  grid  [  k  ][  l  ]     ==     1  )     {      int     distance      =     Math  .  abs  (  i     -     k  )      +     Math  .  abs  (  j     -     l  );      if     (  distance       <     ans  .  get  (  i  ).  get  (  j  ))     {      ans  .  get  (  i  ).  set  (  j       distance  );      }      }      }      }      }      }      return     ans  ;      }      //Driver Code Starts      public     static     void     main  (  String  []     args  )      {      int  [][]     grid     =     {     {     0       1       1       0     }      {     1       1       0       0     }      {     0       0       1       1     }     };      ArrayList   <  ArrayList   <  Integer  >     >     ans     =     nearest  (  grid  );      for     (  ArrayList   <  Integer  >     row     :     ans  )     {      for     (  Integer     val     :     row  )     {      System  .  out  .  print  (  val     +     ' '  );      }      System  .  out  .  println  ();      }      }   }   //Driver Code Ends     Python   
    def   nearest  (  grid  ):   n   =   len  (  grid  )   m   =   len  (  grid  [  0  ])   ans   =   [[  float  (  'inf'  )]   *   m   for   _   in   range  (  n  )]   # visit each cell of the grid   for   i   in   range  (  n  ):   for   j   in   range  (  m  ):   # if the cell has 1   # then the distance is 0   if   grid  [  i  ][  j  ]   ==   1  :   ans  [  i  ][  j  ]   =   0   continue   # iterate over all the cells   # and find the distance of the nearest 1   for   k   in   range  (  n  ):   for   l   in   range  (  m  ):   if   grid  [  k  ][  l  ]   ==   1  :   ans  [  i  ][  j  ]   =   min  (  ans  [  i  ][  j  ]   abs  (  i   -   k  )   +   abs  (  j   -   l  ))   return   ans       #Driver Code Starts   if   __name__   ==   '__main__'  :   grid   =   [[  0     1     1     0  ]   [  1     1     0     0  ]   [  0     0     1     1  ]]   ans   =   nearest  (  grid  )   for   i   in   range  (  len  (  ans  )):   for   j   in   range  (  len  (  ans  [  i  ])):   print  (  ans  [  i  ][  j  ]   end  =  ' '  )   print  ()   #Driver Code Ends     C#   
    //Driver Code Starts   using     System  ;   using     System.Collections.Generic  ;   class     GfG     {   //Driver Code Ends         static     List   <  List   <  int  >     >     nearest  (  int  [     ]     grid  )      {      int     n     =     grid  .  GetLength  (  0  );      int     m     =     grid  .  GetLength  (  1  );      List   <  List   <  int  >     >     ans     =     new     List   <  List   <  int  >     >  ();      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      List   <  int  >     row     =     new     List   <  int  >  ();      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      row  .  Add  (  int  .  MaxValue  );      }      ans  .  Add  (  row  );      }      // Visit each cell of the grid      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      // If the cell has 1 distance is 0      if     (  grid  [  i       j  ]     ==     1  )     {      ans  [  i  ][  j  ]     =     0  ;      continue  ;      }      // iterate over all the cells      // and find the distance of the nearest 1      for     (  int     k     =     0  ;     k      <     n  ;     k  ++  )     {      for     (  int     l     =     0  ;     l      <     m  ;     l  ++  )     {      if     (  grid  [  k       l  ]     ==     1  )     {      int     distance      =     Math  .  Abs  (  i     -     k  )      +     Math  .  Abs  (  j     -     l  );      if     (  distance      <     ans  [  i  ][  j  ])     {      ans  [  i  ][  j  ]     =     distance  ;      }      }      }      }      }      }      return     ans  ;      }      //Driver Code Starts      static     void     Main  ()      {      int  [     ]     grid     =     {     {     0       1       1       0     }      {     1       1       0       0     }      {     0       0       1       1     }     };      List   <  List   <  int  >     >     ans     =     nearest  (  grid  );      for     (  int     i     =     0  ;     i      <     ans  .  Count  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     ans  [  i  ].  Count  ;     j  ++  )     {      Console  .  Write  (  ans  [  i  ][  j  ]     +     ' '  );      }      Console  .  WriteLine  ();      }      }   }   //Driver Code Ends     JavaScript   
    function     nearest  (  grid  )   {      let     n     =     grid  .  length  ;      let     m     =     grid  [  0  ].  length  ;      let     ans     =     new     Array  (  n  );      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      ans  [  i  ]     =     new     Array  (  m  ).  fill  (  Infinity  );      }      // visit each cell of the grid      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  let     j     =     0  ;     j      <     m  ;     j  ++  )     {      // if the cell has 1      // then the distance is 0      if     (  grid  [  i  ][  j  ]     ===     1  )     {      ans  [  i  ][  j  ]     =     0  ;      continue  ;      }      // iterate over all the cells      // and find the distance of the nearest 1      for     (  let     k     =     0  ;     k      <     n  ;     k  ++  )     {      for     (  let     l     =     0  ;     l      <     m  ;     l  ++  )     {      if     (  grid  [  k  ][  l  ]     ===     1  )     {      ans  [  i  ][  j  ]     =     Math  .  min  (      ans  [  i  ][  j  ]      Math  .  abs  (  i     -     k  )      +     Math  .  abs  (  j     -     l  ));      }      }      }      }      }      return     ans  ;   }      // Driver Code   //Driver Code Starts   let     grid     =      [     [     0       1       1       0     ]     [     1       1       0       0     ]     [     0       0       1       1     ]     ];   let     ans     =     nearest  (  grid  );   for     (  let     i     =     0  ;     i      <     ans  .  length  ;     i  ++  )     {      console  .  log  (  ans  [  i  ].  join  (  ' '  ));   }   //Driver Code Ends       
Ieșire
1 0 0 1 0 0 1 1 1 1 0 0  

[Abordare așteptată] - Utilizarea lățimii prima căutare - O(n * m) Timp și O (n * m) Spațiu

Problema poate fi rezolvată eficient folosind o abordare BFS cu mai multe surse. Fiecare celulă din grilă este tratată ca un nod cu margini care leagă celulele adiacente (sus jos, stânga, dreapta). În loc să rulăm o căutare separată pentru fiecare celulă 0, punem în coadă toate celulele care conțin 1 la început și efectuăm un singur BFS din aceste surse multiple simultan. Pe măsură ce BFS se extinde strat cu strat, actualizăm distanța fiecărei celule 0 nevizitate pentru a fi cu una mai mare decât distanța părintelui său. Acest lucru garantează că fiecare celulă primește distanța minimă până la cel mai apropiat 1 într-un mod optim și eficient.

C++
    //Driver Code Starts   #include          #include      #include      #include      using     namespace     std  ;   //Driver Code Ends      vector   <  vector   <  int  >>     nearest  (  vector   <  vector   <  int  >>     &  grid  )     {      int     n     =     grid  .  size  ();      int     m     =     grid  [  0  ].  size  ();      vector   <  vector   <  int  >>     ans  (  n       vector   <  int  >  (  m       INT_MAX  ));      // to store the indices of the cells having 1      queue   <  pair   <  int       int  >>     q  ;      // visit each cell of the grid      for  (  int     i     =     0  ;     i   <  n  ;     i  ++  )     {      for  (  int     j     =     0  ;     j   <  m  ;     j  ++  )     {      // if the cell has 1       // then the distance is 0      if  (  grid  [  i  ][  j  ]     ==     1  )     {      ans  [  i  ][  j  ]     =     0  ;      q  .  push  ({  i       j  });      }      }      }      // iterate over all the cells      // and find the distance of the nearest 1      while  (  !  q  .  empty  ())     {      int     len     =     q  .  size  ();          for  (  int     i     =     0  ;     i   <  len  ;     i  ++  )     {      int     x     =     q  .  front  ().  first  ;      int     y     =     q  .  front  ().  second  ;      q  .  pop  ();      // check all the four directions      vector   <  vector   <  int  >>     directions     =         {{  0       1  }     {  0       -1  }     {  1       0  }     {  -1       0  }};      for     (  int     j     =     0  ;     j      <     directions  .  size  ();     j  ++  )     {      int     dx     =     directions  [  j  ][  0  ];      int     dy     =     directions  [  j  ][  1  ];      // if the cell is within the grid       // and the distance is not calculated yet      if     (  x  +  dx     >=     0     &&     x  +  dx      <     n     &&     y  +  dy     >=     0     &&         y  +  dy      <     m     &&     ans  [  x  +  dx  ][  y  +  dy  ]     ==     INT_MAX  )     {      ans  [  x  +  dx  ][  y  +  dy  ]     =     ans  [  x  ][  y  ]     +     1  ;      q  .  push  ({  x  +  dx       y  +  dy  });      }      }      }      }      return     ans  ;   }      //Driver Code Starts   int     main  ()     {      vector   <  vector   <  int  >>     grid     =     {{  0    1    1    0  }     {  1    1    0    0  }     {  0    0    1    1  }};      vector   <  vector   <  int  >>     ans     =     nearest  (  grid  );      for     (  int     i     =     0  ;     i      <     ans  .  size  ();     i  ++  )     {      for     (  int     j     =     0  ;     j      <     ans  [  i  ].  size  ();     j  ++  )     {      cout      < <     ans  [  i  ][  j  ]      < <     ' '  ;      }      cout      < <     endl  ;      }      return     0  ;   }   //Driver Code Ends     Java   
    //Driver Code Starts   import     java.util.ArrayList  ;   import     java.util.Queue  ;   import     java.util.LinkedList  ;   import     java.util.Arrays  ;   class   GfG     {   //Driver Code Ends         static     ArrayList   <  ArrayList   <  Integer  >>     nearest  (  int  [][]     grid  )     {      int     n     =     grid  .  length  ;      int     m     =     grid  [  0  ]  .  length  ;      int  [][]     ans     =     new     int  [  n  ][  m  ]  ;      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      Arrays  .  fill  (  ans  [  i  ]       Integer  .  MAX_VALUE  );      }      // to store the indices of the cells having 1      Queue   <  int  []>     q     =     new     LinkedList   <>  ();      // visit each cell of the grid      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      // if the cell has 1       // then the distance is 0      if     (  grid  [  i  ][  j  ]     ==     1  )     {      ans  [  i  ][  j  ]     =     0  ;      q  .  add  (  new     int  []  {  i       j  });      }      }      }      // iterate over all the cells      // and find the distance of the nearest 1      while     (  !  q  .  isEmpty  ())     {      int     len     =     q  .  size  ();      for     (  int     i     =     0  ;     i      <     len  ;     i  ++  )     {      int  []     front     =     q  .  poll  ();      int     x     =     front  [  0  ]  ;      int     y     =     front  [  1  ]  ;      // check all the four directions      int  [][]     directions     =     {{  0       1  }     {  0       -  1  }     {  1       0  }     {  -  1       0  }};      for     (  int     j     =     0  ;     j      <     directions  .  length  ;     j  ++  )     {      int     dx     =     directions  [  j  ][  0  ]  ;      int     dy     =     directions  [  j  ][  1  ]  ;      // if the cell is within the grid       // and the distance is not calculated yet      if     (  x     +     dx     >=     0     &&     x     +     dx      <     n     &&     y     +     dy     >=     0     &&     y     +     dy      <     m      &&     ans  [  x     +     dx  ][  y     +     dy  ]     ==     Integer  .  MAX_VALUE  )     {      ans  [  x     +     dx  ][  y     +     dy  ]     =     ans  [  x  ][  y  ]     +     1  ;      q  .  add  (  new     int  []  {  x     +     dx       y     +     dy  });      }      }      }      }      ArrayList   <  ArrayList   <  Integer  >>     result     =     new     ArrayList   <>  ();      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )     {      ArrayList   <  Integer  >     row     =     new     ArrayList   <>  ();      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )     {      row  .  add  (  ans  [  i  ][  j  ]  );      }      result  .  add  (  row  );      }      return     result  ;      }      //Driver Code Starts      public     static     void     main  (  String  []     args  )     {      int  [][]     grid     =     {{  0    1    1    0  }     {  1    1    0    0  }     {  0    0    1    1  }};      ArrayList   <  ArrayList   <  Integer  >>     ans     =     nearest  (  grid  );      for     (  ArrayList   <  Integer  >     row     :     ans  )     {      for     (  int     val     :     row  )     {      System  .  out  .  print  (  val     +     ' '  );      }      System  .  out  .  println  ();      }      }   }   //Driver Code Ends     Python   
    #Driver Code Starts   from   collections   import   deque   import   sys   #Driver Code Ends      def   nearest  (  grid  ):   n   =   len  (  grid  )   m   =   len  (  grid  [  0  ])   ans   =   [[  sys  .  maxsize   for   _   in   range  (  m  )]   for   _   in   range  (  n  )]   # to store the indices of the cells having 1   q   =   deque  ()   # visit each cell of the grid   for   i   in   range  (  n  ):   for   j   in   range  (  m  ):   # if the cell has 1    # then the distance is 0   if   grid  [  i  ][  j  ]   ==   1  :   ans  [  i  ][  j  ]   =   0   q  .  append  ((  i     j  ))   # iterate over all the cells   # and find the distance of the nearest 1   while   q  :   len_q   =   len  (  q  )   for   _   in   range  (  len_q  ):   x     y   =   q  .  popleft  ()   # check all the four directions   directions   =   [(  0     1  )   (  0     -  1  )   (  1     0  )   (  -  1     0  )]   for   dx     dy   in   directions  :   # if the cell is within the grid    # and the distance is not calculated yet   if   0    <=   x   +   dx    <   n   and   0    <=   y   +   dy    <   m   and   ans  [  x   +   dx  ][  y   +   dy  ]   ==   sys  .  maxsize  :   ans  [  x   +   dx  ][  y   +   dy  ]   =   ans  [  x  ][  y  ]   +   1   q  .  append  ((  x   +   dx     y   +   dy  ))   return   ans      #Driver Code Starts   if   __name__   ==   '__main__'  :   grid   =   [[  0    1    1    0  ]   [  1    1    0    0  ]   [  0    0    1    1  ]]   ans   =   nearest  (  grid  )   for   row   in   ans  :   print  (  ' '  .  join  (  map  (  str     row  )))   #Driver Code Ends     C#   
    //Driver Code Starts   using     System  ;   using     System.Collections.Generic  ;   class     GFG   {   //Driver Code Ends         static     List   <  List   <  int  >>     nearest  (  int  []     grid  )      {      int     n     =     grid  .  GetLength  (  0  );      int     m     =     grid  .  GetLength  (  1  );      int  []     ans     =     new     int  [  n       m  ];      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )      {      ans  [  i       j  ]     =     int  .  MaxValue  ;      }      }      // to store the indices of the cells having 1      Queue   <  Tuple   <  int       int  >>     q     =     new     Queue   <  Tuple   <  int       int  >>  ();      // visit each cell of the grid      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      {      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )      {      // if the cell has 1       // then the distance is 0      if     (  grid  [  i       j  ]     ==     1  )      {      ans  [  i       j  ]     =     0  ;      q  .  Enqueue  (  new     Tuple   <  int       int  >  (  i       j  ));      }      }      }      // iterate over all the cells      // and find the distance of the nearest 1      while     (  q  .  Count     >     0  )      {      int     len     =     q  .  Count  ;      for     (  int     i     =     0  ;     i      <     len  ;     i  ++  )      {      var     node     =     q  .  Dequeue  ();      int     x     =     node  .  Item1  ;      int     y     =     node  .  Item2  ;      // check all the four directions      int  []     directions     =     new     int  []      {      {  0       1  }      {  0       -  1  }      {  1       0  }      {  -  1       0  }      };      for     (  int     j     =     0  ;     j      <     4  ;     j  ++  )      {      int     dx     =     directions  [  j       0  ];      int     dy     =     directions  [  j       1  ];      // if the cell is within the grid       // and the distance is not calculated yet      if     (  x     +     dx     >=     0     &&     x     +     dx      <     n     &&     y     +     dy     >=     0     &&     y     +     dy      <     m     &&     ans  [  x     +     dx       y     +     dy  ]     ==     int  .  MaxValue  )      {      ans  [  x     +     dx       y     +     dy  ]     =     ans  [  x       y  ]     +     1  ;      q  .  Enqueue  (  new     Tuple   <  int       int  >  (  x     +     dx       y     +     dy  ));      }      }      }      }      // Convert 2D array to List > before returning      List   <  List   <  int  >>     result     =     new     List   <  List   <  int  >>  ();      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      {      List   <  int  >     row     =     new     List   <  int  >  ();      for     (  int     j     =     0  ;     j      <     m  ;     j  ++  )      {      row  .  Add  (  ans  [  i       j  ]);      }      result  .  Add  (  row  );      }      return     result  ;      }      //Driver Code Starts      static     void     Main  ()      {      int  []     grid     =     new     int  []      {      {  0       1       1       0  }      {  1       1       0       0  }      {  0       0       1       1  }      };      List   <  List   <  int  >>     ans     =     nearest  (  grid  );      for     (  int     i     =     0  ;     i      <     ans  .  Count  ;     i  ++  )      {      for     (  int     j     =     0  ;     j      <     ans  [  i  ].  Count  ;     j  ++  )      {      Console  .  Write  (  ans  [  i  ][  j  ]     +     ' '  );      }      Console  .  WriteLine  ();      }      }   }   //Driver Code Ends     JavaScript   
    //Driver Code Starts   const     Denque     =     require  (  'denque'  );   //Driver Code Ends      function     nearest  (  grid  )     {      let     n     =     grid  .  length  ;      let     m     =     grid  [  0  ].  length  ;      // Initialize answer matrix with Infinity      let     ans     =     [];      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      ans  .  push  (  new     Array  (  m  ).  fill  (  Infinity  ));      }      // to store the indices of the cells having 1      let     q     =     new     Denque  ();      // visit each cell of the grid      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      for     (  let     j     =     0  ;     j      <     m  ;     j  ++  )     {      // if the cell has 1       // then the distance is 0      if     (  grid  [  i  ][  j  ]     ===     1  )     {      ans  [  i  ][  j  ]     =     0  ;      q  .  push  ([  i       j  ]);      }      }      }      // iterate over all the cells      // and find the distance of the nearest 1      while     (  !  q  .  isEmpty  ())     {      let     [  x       y  ]     =     q  .  shift  ();      // check all the four directions      let     directions     =     [      [  0       1  ]      [  0       -  1  ]      [  1       0  ]      [  -  1       0  ]      ];      for     (  let     dir     of     directions  )     {      let     dx     =     dir  [  0  ];      let     dy     =     dir  [  1  ];      // if the cell is within the grid       // and the distance is not calculated yet      if     (  x     +     dx     >=     0     &&     x     +     dx      <     n     &&     y     +     dy     >=     0     &&     y     +     dy      <     m     &&     ans  [  x     +     dx  ][  y     +     dy  ]     ===     Infinity  )     {      ans  [  x     +     dx  ][  y     +     dy  ]     =     ans  [  x  ][  y  ]     +     1  ;      q  .  push  ([  x     +     dx       y     +     dy  ]);      }      }      }      return     ans  ;   }      //Driver Code Starts   // Driver Code   let     grid     =     [      [  0       1       1       0  ]      [  1       1       0       0  ]      [  0       0       1       1  ]   ];   let     ans     =     nearest  (  grid  );   for     (  let     i     =     0  ;     i      <     ans  .  length  ;     i  ++  )     {      console  .  log  (  ans  [  i  ].  join  (  ' '  ));   }   //Driver Code Ends       
Ieșire
1 0 0 1 0 0 1 1 1 1 0 0  
Creați un test

Top Articole

Categorie

Articole Interesante