Étant donné un binaire grille[][] . Trouver la distance du plus proche 1 dans la grille pour chaque cellule.
La distance est calculée comme |je 1 - je 2 | + |j 1 -j 2 | où je1j1 sont le numéro de ligne et le numéro de colonne de la cellule actuelle et i2j2 sont le numéro de ligne et le numéro de colonne de la cellule la plus proche ayant la valeur 1.
longueur de chaîne en java
Note: Il doit y avoir au moins une cellule avec la valeur 1 dans la grille.
Exemples :
Saisir: grille[][] = [[0 1 1 0]
[1 1 0 0]
[0 0 1 1]]
Sortir: [[1 0 0 1]
[0 0 1 1]
[1 1 0 0]]
Explication:
la cellule (0 1) a le 1 le plus proche à la cellule (0 0) - distance = |0-0| + |0-1| = 1
la cellule (0 2) a le 1 le plus proche à la cellule (0 3) - distance = |0-0| + |3-2| = 1
la cellule (1 0) a le 1 le plus proche à la cellule (0 0) - distance = |1-0| + |0-0| = 1
la cellule (1 1) a le 1 le plus proche à la cellule (1 2) - distance = |1-1| + |1-2| = 1
la cellule (2 2) a le 1 le plus proche à la cellule (2 1) - distance = |2-2| + |2-1| = 1
la cellule (2 3) a le 1 le plus proche à la cellule (1 3) - distance = |2-1| + |3-3| = 1
Les autres sont tous des cellules ayant 1, donc leur distance par rapport à la cellule la plus proche ayant 1 est de 0.Saisir: grille[][] = [[1 0 1]
[1 1 0]
[1 0 0]]
Sortir: [[0 1 0]
[0 0 1]
[0 1 2]]
Explication:
la cellule (0 0) a le 1 le plus proche à la cellule (0 1) - distance = |0-0| + |0-1| = 1
la cellule (0 2) a le 1 le plus proche à la cellule (0 1) - distance = |0-0| + |2-1| = 1
la cellule (1 0) a le 1 le plus proche à la cellule (0 1) - distance = |1-0| + |0-1| = 2
la cellule (1 1) a le 1 le plus proche à la cellule (1 2) - distance = |1-1| + |1-2| = 1
la cellule (2 0) a le 1 le plus proche à la cellule (2 1) - distance = |2-2| + |2-1| = 1
la cellule (2 2) a le 1 le plus proche à la cellule (2 1) - distance = |2-2| + |2-1| = 1
Les autres sont tous des cellules ayant 1, donc leur distance par rapport à la cellule la plus proche ayant 1 est de 0.
Table des matières
- [Approche naïve] - O((n*m)^2) Temps et O(n * m) Espace
- [Approche attendue] - Utilisation de la recherche en largeur d'abord - O(n * m) Temps et O(n * m) Espace
[Approche naïve] - O((n*m)^2) Temps et O(n * m) Espace
C++L'idée est de parcourir toute la grille et de calculer la distance de chaque cellule au 1 près :
- Si la cellule contient 1, sa distance est 0.
- Si la cellule contient 0, nous parcourons toute la grille pour trouver la cellule la plus proche contenant 1.
- Pour chaque cellule 0, calculez la distance de Manhattan par rapport à toutes les cellules avec 1 et prenez la distance minimale.
Stockez cette distance minimale dans la cellule correspondante de la matrice résultat. Répétez l’opération pour toutes les cellules de la grille.
//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
Sortir
1 0 0 1 0 0 1 1 1 1 0 0
[Approche attendue] - Utilisation de la recherche en largeur d'abord - O(n * m) Temps et O(n * m) Espace
C++Le problème peut être résolu efficacement en utilisant une approche BFS multi-sources. Chaque cellule de la grille est traitée comme un nœud dont les bords relient les cellules adjacentes (en haut, en bas, à gauche et à droite). Au lieu d'exécuter une recherche distincte pour chaque cellule 0, nous mettons en file d'attente toutes les cellules contenant 1 au début et effectuons simultanément un seul BFS à partir de ces multiples sources. Au fur et à mesure que le BFS se développe couche par couche, nous mettons à jour la distance de chaque cellule 0 non visitée pour qu'elle soit supérieure d'une unité à la distance de son parent. Cela garantit que chaque cellule reçoit la distance minimale au 1 le plus proche de manière optimale et efficace.
//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
Sortir
1 0 0 1 0 0 1 1 1 1 0 0Créer un quiz