둘 이상의 그룹이 있고 그들이 만나서 총 이동 거리를 최소화하기를 원한다고 가정합니다. 값이 0 또는 1인 2D 그리드가 있으며 각 1은 그룹 내 누군가의 집을 표시합니다. 거리는 맨해튼 거리 공식을 사용하여 계산되므로 distance(p1, p2) =|p2.x - p1.x| + |p2.y - p1.y|.
따라서 입력이 다음과 같으면
1 | 0 | 0 | 0 | 1 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 0 | 0 |
그러면 (0,0), (0,4), (2,2)에 살고 있는 세 사람이 이해할 수 있는 행렬에서 출력이 6이 됩니다. 포인트 (0,2 )는 2+2+2=6의 총 이동 거리가 최소이므로 이상적인 만남의 장소입니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
get() 함수를 정의하면 배열 v가 필요합니다.
-
배열 v
정렬 -
나는 :=0
-
j :=v의 크기
-
ret :=0
-
i
-
렛 :=렛 + v[j] - v[i]
-
(i를 1씩 증가)
-
(j를 1만큼 감소)
-
-
리턴 렛
-
주요 방법에서 다음을 수행하십시오 -
-
배열 행 정의
-
배열 열 정의
-
for initialize i :=0, i <그리드 크기일 때 업데이트(i 1만큼 증가), -
-
j 초기화의 경우:=0, j <그리드[0]의 크기일 때 업데이트(j를 1만큼 증가), 수행 -
-
grid[i, j]가 0이 아니면 -
-
행 끝에 i 삽입
-
열 끝에 j 삽입
-
-
-
-
리턴 get(row) + get(col)
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h> using namespace std; class Solution { public: int minTotalDistance(vector<vector<int>>& grid) { vector<int> row; vector<int> col; for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { if (grid[i][j]) { row.push_back(i); col.push_back(j); } } } return get(row) + get(col); } int get(vector <int> v){ sort(v.begin(), v.end()); int i = 0; int j = v.size() - 1; int ret = 0; while (i < j) { ret += v[j] - v[i]; i++; j--; } return ret; } }; main(){ Solution ob; vector<vector<int>> v = {{1,0,0,0,1},{0,0,0,0,0},{0,0,1,0,0}}; cout << (ob.minTotalDistance(v)); }
입력
{{1,0,0,0,1},{0,0,0,0,0},{0,0,1,0,0}}
출력
6