首頁 > 後端開發 > C++ > 主體

C++程式用於計算機器人在網格中完成一次行程所需的總成本

WBOY
發布: 2023-08-25 16:53:17
轉載
1301 人瀏覽過

C++程式用於計算機器人在網格中完成一次行程所需的總成本

假設我們有一個尺寸為 h x w 的網格。網格中的每個單元格包含一個正整數。現在有一個路徑查找機器人放置在特定的單元格(p,q)上(其中 p 是行號,q 是列號),它可以移動到單元格(i,j)。移動操作有一個特定的成本,等於 |p - i| |q - j|。現在有 q 個旅行,具有以下屬性。

  • 每個旅行有兩個值(x,y),並且有一個共同的值 d。

  • 機器人放置在一個值為 x 的儲存格上,然後移動到另一個值為 x d 的儲存格。

  • 然後它會移到另一個值為 x d d 的儲存格。這個過程將繼續,直到機器人到達一個值大於或等於 y 的單元格。

  • y - x 是 d 的倍數。

給定這些旅行,我們必須找出每次旅行的總成本。如果機器人無法移動,則旅行成本為 0。

因此,若輸入是h = 3,w = 3,d = 3,q = 1,grid = {{2,6,8},{7,3,4},{5,1 ,9}},trips = {{3,9}},則輸出將是4。

3 在儲存格(2,2)上

6 在儲存格(1,2)上

9 在儲存格(3,3)上

總成本= |(1 - 2) (2 - 2)| |(3 - 1) (3 - 2)| = 4。

要解決這個問題,我們將按照以下步驟進行:

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)
登入後複製

讓我們看下面的實作以便更好地理解−

範例

#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;
}
登入後複製

Input

3, 3, 3, 1, {{2, 6, 8}, {7, 3, 4}, {5, 1, 9}}, {{3, 9}}
登入後複製

輸出

4
登入後複製

以上是C++程式用於計算機器人在網格中完成一次行程所需的總成本的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!