Классический алгоритм в 2D-версии обычно описывается как
Учитывая n неотрицательных целых чисел, представляющих карту высот, где ширина каждого бара равна 1, вычислите, сколько воды оно может поймать после дождя.
Например, учитывая ввод
[0,1,0,2,1,0,1,3,2,1,2,1]
возвращаемое значение будет
6
Алгоритм, который я использовал для решения вышеупомянутой двумерной задачи, -
int trapWaterVolume2D(vector<int> A) {
int n = A.size();
vector<int> leftmost(n, 0), rightmost(n, 0);
//left exclusive scan, O(n), the highest bar to the left each point
int leftMaxSoFar = 0;
for (int i = 0; i < n; i++){
leftmost[i] = leftMaxSoFar;
if (A[i] > leftMaxSoFar) leftMaxSoFar = A[i];
}
//right exclusive scan, O(n), the highest bar to the right each point
int rightMaxSoFar = 0;
for (int i = n - 1; i >= 0; i--){
rightmost[i] = rightMaxSoFar;
if (A[i] > rightMaxSoFar) rightMaxSoFar = A[i];
}
// Summation, O(n)
int vol = 0;
for (int i = 0; i < n; i++){
vol += max(0, min(leftmost[i], rightmost[i]) - A[i]);
}
return vol;
}
Мой вопрос заключается в том, как сделать вышеуказанный алгоритм доступным для 3D-версии проблемы, чтобы вычислить максимум воды, захваченной в реальном 3D-ландшафте. т.е. реализовать
int trapWaterVolume3D(vector<vector<int> > A);
Пример графика:
Мы знаем высоту в каждой точке (x, y), и цель состоит в том, чтобы вычислить максимальный объем воды, который может быть захвачен в форме. Любые мысли и ссылки приветствуются.