Dado um binário grade[][] . Encontre a distância do mais próximo 1 na grade para cada célula.
A distância é calculada como |eu 1 - eu 2 | + |j 1 - j 2 | onde eu1j1 são o número da linha e o número da coluna da célula atual e i2j2 são o número da linha e o número da coluna da célula mais próxima com valor 1.
Observação: Deve haver pelo menos uma célula com valor 1 na grade.
Exemplos:
Entrada: grade[][] = [[0 1 1 0]
[1 1 0 0]
[0 0 1 1]]
Saída: [[1 0 0 1]
[0 0 1 1]
[1 1 0 0]]
Explicação:
célula (0 1) tem 1 mais próximo na célula (0 0) - distância = |0-0| + |0-1| = 1
a célula (0 2) tem o 1 mais próximo na célula (0 3) - distância = |0-0| + |3-2| = 1
célula (1 0) tem 1 mais próximo na célula (0 0) - distância = |1-0| + |0-0| = 1
a célula (1 1) tem o 1 mais próximo na célula (1 2) - distância = |1-1| + |1-2| = 1
a célula (2 2) tem 1 mais próximo na célula (2 1) - distância = |2-2| + |2-1| = 1
a célula (2 3) tem 1 mais próximo na célula (1 3) - distância = |2-1| + |3-3| = 1
O resto são células com 1, então a distância da célula mais próxima com 1 é 0.Entrada: grade[][] = [[1 0 1]
[1 1 0]
[1 0 0]]
Saída: [[0 1 0]
[0 0 1]
[0 1 2]]
Explicação:
célula (0 0) tem 1 mais próximo na célula (0 1) - distância = |0-0| + |0-1| = 1
a célula (0 2) tem o 1 mais próximo na célula (0 1) - distância = |0-0| + |2-1| = 1
célula (1 0) tem 1 mais próximo na célula (0 1) - distância = |1-0| + |0-1| = 2
a célula (1 1) tem o 1 mais próximo na célula (1 2) - distância = |1-1| + |1-2| = 1
a célula (2 0) tem 1 mais próximo na célula (2 1) - distância = |2-2| + |2-1| = 1
a célula (2 2) tem 1 mais próximo na célula (2 1) - distância = |2-2| + |2-1| = 1
O resto são células com 1, então a distância da célula mais próxima com 1 é 0.
Índice
- [Abordagem ingênua] - O((n*m)^2) Tempo e O(n * m) Espaço
- [Abordagem esperada] - Usando a primeira pesquisa em amplitude - O(n * m) Tempo e O(n * m) Espaço
[Abordagem ingênua] - O((n*m)^2) Tempo e O(n * m) Espaço
C++A ideia é percorrer toda a grade e calcular a distância de cada célula até o 1 mais próximo:
- Se a célula contém 1, sua distância é 0.
- Se a célula contém 0, percorremos toda a grade para encontrar a célula mais próxima que contém 1.
- Para cada célula 0 calcule a distância de Manhattan para todas as células com 1 e calcule a distância mínima.
Armazene esta distância mínima na célula correspondente da matriz de resultados. Repita para todas as células da grade.
//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
Saída
1 0 0 1 0 0 1 1 1 1 0 0
[Abordagem esperada] - Usando a primeira pesquisa em amplitude - O(n * m) Tempo e O(n * m) Espaço
C++O problema pode ser resolvido de forma eficiente usando uma abordagem BFS de múltiplas fontes. Cada célula na grade é tratada como um nó com bordas conectando células adjacentes (de cima para baixo, à esquerda, à direita). Em vez de executar uma pesquisa separada para cada célula 0, enfileiramos todas as células contendo 1 no início e executamos um único BFS dessas múltiplas fontes simultaneamente. À medida que o BFS se expande camada por camada, atualizamos a distância de cada célula 0 não visitada para ser uma a mais que a distância de seu pai. Isso garante que cada célula receba a distância mínima até o 1 mais próximo de maneira ideal e eficiente.
//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 = {{0110} {1100} {0011}}; 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 = {{0110} {1100} {0011}}; 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 = [[0110] [1100] [0011]] 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
Saída
1 0 0 1 0 0 1 1 1 1 0 0Criar questionário