Heim  >  Artikel  >  Backend-Entwicklung  >  C++-Programm zur Berechnung der Gesamtkosten, die ein Roboter benötigt, um eine Fahrt in einem Raster abzuschließen

C++-Programm zur Berechnung der Gesamtkosten, die ein Roboter benötigt, um eine Fahrt in einem Raster abzuschließen

WBOY
WBOYnach vorne
2023-08-25 16:53:171304Durchsuche

C++-Programm zur Berechnung der Gesamtkosten, die ein Roboter benötigt, um eine Fahrt in einem Raster abzuschließen

Angenommen, wir haben ein Raster der Größe H x B. Jede Zelle im Raster enthält eine positive ganze Zahl. Jetzt gibt es einen Wegfindungsroboter, der auf einer bestimmten Zelle (p, q) platziert ist (wobei p die Zeilennummer und q die Spaltennummer ist) und er kann sich zu Zelle (i, j) bewegen. Der Verschiebungsvorgang hat spezifische Kosten von |p – i| + |q – j|. Mittlerweile gibt es q Fahrten mit folgenden Eigenschaften.

  • Jede Fahrt hat zwei Werte (x, y) und einen gemeinsamen Wert d.

  • Der Roboter wird auf eine Zelle mit dem Wert x gesetzt und bewegt sich dann zu einer anderen Zelle mit dem Wert x + d.

  • Dann wird es in eine andere Zelle mit dem Wert x + d + d verschoben. Dieser Vorgang wird fortgesetzt, bis der Roboter eine Zelle mit einem Wert größer oder gleich y erreicht.

  • y - x ist ein Vielfaches von d.

Angesichts dieser Reisen müssen wir die Gesamtkosten jeder Reise ermitteln. Wenn sich der Roboter nicht bewegen kann, betragen die Reisekosten 0.

Wenn die Eingabe also h = 3, w = 3, d = 3, q ​​​​= 1, Gitter = {{2, 6, 8}, {7, 3, 4}, {5, 1, 9 ist }} , tripes = {{3, 9}}, dann ist die Ausgabe 4.

3 auf Zelle (2, 2)

6 auf Zelle (1, 2)

9 auf Zelle (3, 3)

Gesamtkosten = | (1 - 2) + (2 - 2) | (3 - 1) + (3 - 2) | = 4.

Um dieses Problem zu lösen, werden wir die folgenden Schritte ausführen:

Define one map loc
for initialize i := 0, when i < h, update (increase i by 1), do:
   for initialize j := 0, when j < w, update (increase j by 1), do:
      loc[grid[i, j]] := new pair(i, j)
Define an array dp[d + 1]
for initialize i := 1, when i <= d, update (increase i by 1), do:
   j := i
   while j < w * h, do:
      n := j + d
      if j + d > w * h, then:
      Come out from the loop
   dx := |first value of loc[n] - first value of loc[j]|
   dy := |second value of loc[n] - second value of loc[j]|
   j := j + d
   insert dx + dy at the end of dp[i]
for initialize j := 1, when j < size of dp[i], update (increase j by 1), do:
   dp[i, j] := dp[i, j] + dp[i, j - 1]
for initialize i := 0, when i < q, update (increase i by 1), do:
   tot := 0
   le := first value of trips[i]
   ri := second value of trips[i]
   if ri mod d is same as 0, then:
      f := d
   Otherwise,
         f := ri mod d
   pxl := (le - f) / d
   pxr := (ri - f) / d
   if le is same as f, then:
    if ri is same as f, then:
      tot := 0
   Otherwise
      tot := tot + (dp[f, pxr - 1] - 0)
   Otherwise
      if ri is same as f, then:
            tot := 0
  Otherwise
tot := tot + dp[f, pxr - 1] - dp[f, pxl - 1]
print(tot)

Sehen wir uns zum besseren Verständnis die Implementierung unten an −

Beispiel

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
void solve(int h, int w, int d, int q, vector<vector<int>> grid,
vector<pair<int, int>> trips) {
   map<int, pair<int, int>> loc;
   for (int i = 0; i < h; i++) {
      for (int j = 0; j < w; j++)
         loc[grid[i][j]] = make_pair(i, j);
   }
   vector<int> dp[d + 1];
   for (int i = 1; i <= d; i++) {
      int j = i;
      while (j < w * h) {
         int n = j + d;
          if (j + d > w * h)
             break;
             int dx = abs(loc[n].first - loc[j].first);
             int dy = abs(loc[n].second - loc[j].second);
             j += d;
             dp[i].push_back(dx + dy);
      }
      for (j = 1; j < dp[i].size(); j++)
        dp[i][j] += dp[i][j - 1];
   }
   for (int i = 0; i < q; i++) {
      int tot = 0;
      int le, ri;
      le = trips[i].first;
      ri = trips[i].second;
      int f;
      if (ri % d == 0)
         f = d;
      else
         f = ri % d;
      int pxl, pxr;
      pxl = (le - f) / d;
      pxr = (ri - f) / d;
      if (le == f){
         if (ri == f)
            tot = 0;
         else
            tot += (dp[f][pxr - 1] - 0);
      } else {
         if (ri == f)
            tot = 0;
         else
            tot += dp[f][pxr - 1] - dp[f][pxl - 1];
      }
      cout<< tot << endl;
    }
}
int main() {
   int h = 3, w = 3, d = 3, q = 1;
   vector<vector<int>> grid = {{2, 6, 8}, {7, 3, 4}, {5, 1, 9}};
   vector<pair<int, int>> trips = {{3, 9}};
   solve(h, w, d, q, grid, trips);
   return 0;
}

Eingabe

3, 3, 3, 1, {{2, 6, 8}, {7, 3, 4}, {5, 1, 9}}, {{3, 9}}

Ausgabe

4

Das obige ist der detaillierte Inhalt vonC++-Programm zur Berechnung der Gesamtkosten, die ein Roboter benötigt, um eine Fahrt in einem Raster abzuschließen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:tutorialspoint.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen