Gegeven een binair getal rooster[][] . Zoek de afstand van de dichtstbijzijnde 1 in het raster voor elke cel.
De afstand wordt berekend als |ik 1 - i 2 | + |j 1 - J 2 | waar ik1J1 zijn het rijnummer en kolomnummer van de huidige cel en i2J2 zijn het rijnummer en kolomnummer van de dichtstbijzijnde cel met waarde 1.
Opmerking: Er moet minimaal één cel met waarde 1 in het raster staan.
Voorbeelden:
c++ int naar tekenreeks
Invoer: raster[][] = [[0 1 1 0]
[1 1 0 0]
[0 0 1 1]]
Uitgang: [[1 0 0 1]
[0 0 1 1]
[1 1 0 0]]
Uitleg:
cel (0 1) heeft de dichtstbijzijnde 1 bij cel (0 0) - afstand = |0-0| + |0-1| = 1
cel (0 2) heeft de dichtstbijzijnde 1 bij cel (0 3) - afstand = |0-0| + |3-2| = 1
cel (1 0) heeft de dichtstbijzijnde 1 bij cel (0 0) - afstand = |1-0| + |0-0| = 1
cel (1 1) heeft de dichtstbijzijnde 1 bij cel (1 2) - afstand = |1-1| + |1-2| = 1
cel (2 2) heeft de dichtstbijzijnde 1 bij cel (2 1) - afstand = |2-2| + |2-1| = 1
cel (2 3) heeft de dichtstbijzijnde 1 bij cel (1 3) - afstand = |2-1| + |3-3| = 1
De rest zijn allemaal cellen met 1, dus hun afstand tot de dichtstbijzijnde cel met 1 is 0.Invoer: raster[][] = [[1 0 1]
[1 1 0]
[1 0 0]]
Uitgang: [[0 1 0]
[0 0 1]
[0 1 2]]
Uitleg:
cel (0 0) heeft de dichtstbijzijnde 1 bij cel (0 1) - afstand = |0-0| + |0-1| = 1
cel (0 2) heeft de dichtstbijzijnde 1 bij cel (0 1) - afstand = |0-0| + |2-1| = 1
cel (1 0) heeft de dichtstbijzijnde 1 bij cel (0 1) - afstand = |1-0| + |0-1| = 2
cel (1 1) heeft de dichtstbijzijnde 1 bij cel (1 2) - afstand = |1-1| + |1-2| = 1
cel (2 0) heeft de dichtstbijzijnde 1 in cel (2 1) - afstand = |2-2| + |2-1| = 1
cel (2 2) heeft de dichtstbijzijnde 1 bij cel (2 1) - afstand = |2-2| + |2-1| = 1
De rest zijn allemaal cellen met 1, dus hun afstand tot de dichtstbijzijnde cel met 1 is 0.
Inhoudsopgave
- [Naïeve benadering] - O((n*m)^2) Tijd en O(n * m) Ruimte
- [Verwachte aanpak] - Eerste zoekopdracht in breedte gebruiken - O(n * m) Tijd en O(n * m) Ruimte
[Naïeve benadering] - O((n*m)^2) Tijd en O(n * m) Ruimte
C++Het idee is om het hele raster te doorkruisen en de afstand van elke cel tot de dichtstbijzijnde 1 te berekenen:
kandidaat sleutel
- Als de cel 1 bevat, is de afstand 0.
- Als de cel 0 bevat, doorkruisen we het hele raster om de dichtstbijzijnde cel te vinden die 1 bevat.
- Bereken voor elke 0-cel de Manhattan-afstand tot alle cellen met 1 en neem de minimale afstand.
Sla deze minimale afstand op in de overeenkomstige cel van de resultaatmatrix. Herhaal dit voor alle cellen in het raster.
//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
Uitvoer
1 0 0 1 0 0 1 1 1 1 0 0
[Verwachte aanpak] - Eerste zoekopdracht in breedte gebruiken - O(n * m) Tijd en O(n * m) Ruimte
C++Het probleem kan efficiënt worden opgelost met behulp van een BFS-benadering met meerdere bronnen. Elke cel in het raster wordt behandeld als een knooppunt met randen die aangrenzende cellen verbinden (omhoog, omlaag, links, rechts). In plaats van een afzonderlijke zoekopdracht uit te voeren voor elke 0-cel, plaatsen we alle cellen die 1 bevatten aan het begin in de wachtrij en voeren we tegelijkertijd een enkele BFS uit vanuit deze meerdere bronnen. Terwijl de BFS zich laag voor laag uitbreidt, werken we de afstand van elke niet-bezochte 0-cel bij, zodat deze één meer is dan de afstand van de ouder. Dit garandeert dat elke cel op een optimale en efficiënte manier de minimale afstand tot de dichtstbijzijnde 1 ontvangt.
//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
Uitvoer
1 0 0 1 0 0 1 1 1 1 0 0Quiz maken