কম্পিউটার টিউটোরিয়াল

C++-এ কয়েন পাথ (Coin Path)

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

এখন, ইন্ডেক্স ১ থেকে শুরু করে ইন্ডেক্স N-এ ন্যূনতম কয়েন খরচ করে পৌঁছাতে হবে। আমাদের ১ থেকে N পর্যন্ত ইন্ডেক্সের পথ রিটার্ন করতে হবে। একই খরচের একাধিক পথ থাকলে লেক্সিকোগ্রাফিক্যালি সবচেয়ে ছোট পথ বেছে নিতে হবে। কোনো পথ না থাকলে খালি অ্যারে রিটার্ন করবে।

ইনপুট [1,2,4,-1,2], 2 হলে আউটপুট [1,3,5]।

সমাধানের ধাপসমূহ

  • n := A-র আকার
  • ret অ্যারে সংজ্ঞায়িত করুন
  • cost অ্যারে (আকার n) ইনফিনিট দিয়ে ভরুন
  • next অ্যারে (আকার n) -1 দিয়ে ভরুন
  • যদি n শূন্য হয় বা A[n-1] == -1 হয়, তবে endPoint := n-1
  • cost[n-1] = A[n-1]
  • i := n-2 থেকে ০ পর্যন্ত লুপ:
    • যদি A[i] == -1 হয়, তবে স্কিপ করুন
    • j := i+1 থেকে min(n-1, i+B) পর্যন্ত লুপ:
      • যদি cost[j] + A[i] < cost[i] হয়, তবে cost[i] := cost[j] + A[i], next[i] := j, endPoint := i
  • যদি endPoint != 0 হয়, তবে খালি অ্যারে রিটার্ন করুন
  • endPoint != -1 পর্যন্ত লুপে ret-এ endPoint+1 যোগ করুন
  • ret রিটার্ন করুন

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
    cout << "[";
    for(int i = 0; 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;
    }
};
int 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++ কিউ ব্যবহার করে BST-এ একটি পথ রিভার্স করুন

  2. C++ দিয়ে সর্বোচ্চ বেণ্ড (Bends) Barney পথের দৈর্ঘ্য বের করা

  3. C++-এ পাথ সম III

  4. C++-এ ২D ম্যাট্রিক্সে পাথ আছে কিনা তা যাচাই করা