কম্পিউটার

C++ এ কয়েন পাথ


ধরুন আমাদের একটি অ্যারে রয়েছে (সূচী 1 থেকে শুরু হয়) N সংখ্যাগুলির সাথে:A1, A2, ..., AN এবং আরেকটি পূর্ণসংখ্যা B। পূর্ণসংখ্যা B নির্দেশ করে যে যেকোন সূচক থেকে আমি অ্যারেতে আছে, আমরা যে কোনোটিতে যেতে পারি। অ্যারের মধ্যে একটি স্থান সূচীকৃত i+1, i+2, …, i+B যদি এই স্থানে লাফ দেওয়া যায়। এছাড়াও, যদি আমরা সূচক i-এ পা রাখি, তাহলে আমাদের Ai পরিমাণ কয়েন দিতে হবে। Ai যদি -1 হয়, তাহলে এর মানে আমরা অ্যারেতে i সূচীকৃত স্থানে যেতে পারব না।

এখন, যখন আমরা অ্যারে এ সূচীকৃত 1 স্থান থেকে শুরু করি এবং আমাদের লক্ষ্য ন্যূনতম কয়েন ব্যবহার করে সূচীকৃত N স্থানে পৌঁছানো। ন্যূনতম কয়েন ব্যবহার করে সূচীকৃত N স্থানে পৌঁছানোর জন্য আমাদের অ্যারেতে ইনডেক্সের পাথ (1 থেকে N থেকে শুরু করে) ফেরত দিতে হবে। আমাদের যদি একই খরচে একাধিক পথ থাকে, তাহলে আমাদের অভিধানিকভাবে সবচেয়ে ছোট পথটি খুঁজে বের করতে হবে। এবং যদি আমাদের কাছে সূচীকৃত N-এ পৌঁছানোর মতো কোনও সম্ভাব্য পথ না থাকে তবে আমরা একটি খালি অ্যারে ফিরিয়ে দেব।

সুতরাং, ইনপুট যদি [1,2,4,-1,2], 2 এর মত হয়, তাহলে আউটপুট হবে [1,3,5]

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • n :=A

    এর আকার
  • একটি অ্যারে ret সংজ্ঞায়িত করুন

  • n আকারের একটি অ্যারের খরচ সংজ্ঞায়িত করুন এবং এটিকে inf দিয়ে পূরণ করুন

  • n আকারের পাশে একটি অ্যারে সংজ্ঞায়িত করুন এবং এটি -1

    দিয়ে পূরণ করুন
  • যদি n না হয় অ-শূন্য বা A[n - 1] -1 এর সমান, তাহলে −

    • endPoint :=n - 1

  • খরচ[n - 1] =A[n - 1]

  • আরম্ভ করার জন্য i :=n - 2, যখন i>=0, আপডেট করুন (i 1 দ্বারা কম করুন), −

    • যদি A[i] -1 এর মত হয়, তাহলে −

      • নিম্নলিখিত অংশ উপেক্ষা করুন, পরবর্তী পুনরাবৃত্তি এড়িয়ে যান

    • j এর জন্য i + 1 থেকে সর্বনিম্ন (n - 1) এবং i + B এর মধ্যে, j 1 দ্বারা বাড়ান −

      • যদি খরচ[j] + A[i] <খরচ[i] হয়, তাহলে −

        • খরচ[i] :=খরচ[j] + A[i]

        • পরবর্তী[i] :=j

        • endPoint :=i

  • যদি endPoint 0 এর সমান না হয়, তাহলে −

    • খালি অ্যারে ফেরত দিন

  • endPoint-এর জন্য -1 এর সমান নয়, endPoint =পরবর্তী[endPoint], করুন −

    • ret এর শেষে endPoint + 1 সন্নিবেশ করুন

  • রিটার্ন রিটার্ন

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<int> cheapestJump(vector<int>& A, int B) {
      int n = A.size();
      vector <int> ret;
      vector <int> cost(n, 1e9);
      vector <int> next(n, -1);
      if(!n || A[n - 1] == -1) return {};
      int endPoint = n - 1;
      cost[n - 1] = A[n - 1];
      for(int i = n - 2; i >= 0; i--){
         if(A[i] == -1) continue;
         for(int j = i + 1 ; j <= min(n - 1, i + B); j++){
            if(cost[j] + A[i] < cost[i]){
               cost[i] = cost[j] + A[i];
               next[i] = j;
               endPoint = i;
            }
         }
      }
      if(endPoint != 0) return {};
      for(;endPoint != - 1; endPoint = next[endPoint]){
         ret.push_back(endPoint + 1);
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,4,-1,2};
   print_vector(ob.cheapestJump(v, 2));
}

ইনপুট

{1,2,4,-1,2}, 2

আউটপুট

[1, 3, 5, ]

  1. C++ সারি ব্যবহার করে বিএসটি-তে একটি পথ বিপরীত করুন

  2. C++ পাথের দৈর্ঘ্য সর্বাধিক সংখ্যক বাঁক রয়েছে

  3. C++ এ পাথ যোগফল III

  4. C++ এ 2D ম্যাট্রিক্সে সম্ভাব্য পথের জন্য পরীক্ষা করুন