Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सभी दिए गए निर्देशांकों की यात्रा की लागत का पता लगाने के लिए C++ प्रोग्राम

मान लीजिए, हमें n त्रि-आयामी निर्देशांक दिए गए हैं। निर्देशांक (a, b, c) से (x, y, z) तक यात्रा करने की लागत ∣ x - a∣ + ∣ y - b∣ + max(0, z - c) है। हम पहले निर्देशांक से शुरू करते हैं, फिर कम से कम एक बार सभी निर्देशांक पर जाते हैं, और फिर पहले निर्देशांक पर लौटते हैं। हमें इस पूरी यात्रा की कुल लागत का पता लगाना है। निर्देशांक हमें सरणी 'कोर्ड्स' में दिए गए हैं।

इसलिए, यदि इनपुट n =3, कोर्ड्स ={{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

  1. C++ प्रोग्राम ग्राफ में सुपर वर्टिस का पता लगाने के लिए

    मान लीजिए, हमें एक ग्राफ दिया गया है जिसमें n शीर्ष हैं। कोने 1 से n तक गिने जाते हैं, और वे सरणी किनारों में दिए गए किनारों से जुड़े होते हैं। प्रत्येक शीर्ष का 1 से n तक की संख्या के भीतर x मान होता है जो कि सरणी मान में दिया जाता है। अब, हमें ग्राफ से अति शीर्षों का पता लगाना है। एक शीर्ष i को सु

  1. C++ प्रोग्राम दिए गए ग्राफ़ में ब्रिज किनारों की संख्या का पता लगाने के लिए

    मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद

  1. पायथन में सभी को खरीदने के लिए न्यूनतम लागत का पता लगाने का कार्यक्रम

    मान लीजिए, हमारे पास N आइटम हैं, जिन्हें 0, 1, 2,…, N-1 के रूप में चिह्नित किया गया है। फिर, हमें आकार S की एक 2D सूची दी जाती है जिसे सेट कहा जाता है। यहां, हम मूल्य सेट [i, 2] के लिए i-th सेट खरीद सकते हैं, और हम सेट [i, 0] से सेट [i, 1] के बीच प्रत्येक आइटम प्राप्त करते हैं। इसके अलावा, हमारे पास