C++程序找出旅行所有给定坐标的成本

假设给定 n 个三维坐标。从坐标 (a, b, c) 到 (x, y, z) 的成本为 ∣ x − a∣ + ∣ y − b∣ + max(0, z − c)。我们从第一个坐标开始,然后至少访问所有坐标一次,然后返回到第一个坐标。我们必须找出整个行程的总费用。坐标在数组“coords”中提供给我们。

因此,如果输入类似于 n = 3,coords = {{1, 1, 0}, {1, 3, 4}, {3, 2, 2}},那么输出将为 12。

为了解决这个问题,我们将遵循以下步骤 -

Define one 2D array tpa.

tpa[1, 0] := 0

   for initialize i := 1, when i < 2n, update (increase i by 1), do:

      for initialize j := 0, when j < n, update (increase j by 1), do:

         if i mod 2 is same as 0, then:

            Ignore following part, skip to the next iteration

               for initialize t := 0, when t < n, update (increase t by 1), do:

                  x := first value of coords[t]

                  y := second value of coords[t]

                  z := third value of coords[t]

                  p := first value of coords[j]

                  q := second value of coords[j]

                r := third value of coords[j]

tpa[i OR (1 bitwise left shift t)][t] := minimum of (tpa[i|(1 bitwise left shift t)][t], tpa[i][j] + |x - p| + |y - q| + maximum of (0, z - r))

res := infinity

for initialize i := 0, when i < n, update (increase i by 1), do:

x := first value of coords[0]

y := second value of coords[0]

z := third value of coords[0]

p := first value of coords[i]

q := second value of coords[i]

r := third value of coords[i]

res := minimum of (res and tpa[2n - 1, i] + |x - p| + |y - q| + maximum of (0 and z - r))

return res

示例

让我们看看以下实现以更好地理解 -

#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9;

#define N 100

int solve(int n, vector<tuple<int,int,int>> coords){

   vector<vector<int>> tpa(pow(2, n), vector<int>(n, INF));

   tpa[1][0] = 0;

   for(int i = 1; i < pow(2,n); i++) {

      for(int j = 0; j < n; j++){

         if(i % 2 == 0)

            continue;

         for(int t = 0; t < n; t++) {

            int x, y, z, p, q, r;

            tie(x, y, z) = coords[t];

            tie(p, q, r) = coords[j];

            tpa[i | (1 << t)][t] = min(tpa[i|(1 << t)][t], tpa[i][j] + abs(x - p) + abs(y - q) + max(0, z - r));

         }

      }

   }

   int res = INF;

   for(int i = 0; i < n; i++) {

      int x, y, z, p, q, r;

      tie(x, y, z) = coords[0];

      tie(p, q, r) = coords[i];

      res = min(res, tpa[pow(2, n) - 1][i] + abs(x - p) + abs(y - q) + max(0, z - r));

   }

   return res;

}

int main() {

   int n = 3;

   vector<tuple<int,int,int>> coords = {{1, 1, 0}, {1, 3, 4}, {3, 2, 2}};

   cout<< solve(n, coords);

   return 0;

}

输入

3, {{1, 1, 0}, {1, 3, 4}, {3, 2, 2}}
输出结果
12

以上是 C++程序找出旅行所有给定坐标的成本 的全部内容, 来源链接: utcz.com/z/297176.html

回到顶部