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

C++-এ সর্বোচ্চ সোনা সংগ্রহ (পাথ উইথ ম্যাক্সিমাম গোল্ড)


একটি m×n গ্রিডে প্রতিটি সেলে সোনার পরিমাণ দেওয়া। ০ মানে খালি। আপ-ডাউন-লেফট-রাইট ঘুরে সর্বোচ্চ সোনা সংগ্রহ করতে হবে, শর্ত: একই সেল دوبার যাবেন না, ০ ভ্যালুয়াল সেলে যাবেন না।

উদাহরণ: [[0,6,0],[5,8,7],[0,9,0]] → ২৪ (পাথ: 9→8→7)।

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

  • প্রতিটি নন-জিরো সেল থেকে DFS চালান।
  • ভিজিট করা সেলকে -1 দিয়ে মার্ক করুন, ব্যাকট্র্যাকিং সময় ফিরিয়ে দিন।
  • ৪ ডিরেকশনে রিকার্সিভ কল করুন এবং ম্যাক্সিমাম নিন।
  • গ্লোবাল ম্যাক্স আপডেট করুন।

C++ উদাহরণ

#include <bits/stdc++.h>
using namespace std;

class Solution {
    int dfs(vector<vector<int>>& grid, int n, int m, int i, int j) {
        if (i < 0 || i >= n || j < 0 || j >= m || grid[i][j] == 0 || grid[i][j] == -1) return 0;
        int gold = grid[i][j];
        grid[i][j] = -1; // mark visited
        int best = 0;
        best = max(best, dfs(grid, n, m, i+1, j));
        best = max(best, dfs(grid, n, m, i-1, j));
        best = max(best, dfs(grid, n, m, i, j+1));
        best = max(best, dfs(grid, n, m, i, j-1));
        grid[i][j] = gold; // restore
        return gold + best;
    }
public:
    int getMaximumGold(vector<vector<int>>& grid) {
        int n = grid.size(), m = grid[0].size(), ans = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (grid[i][j]) ans = max(ans, dfs(grid, n, m, i, j));
        return ans;
    }
};

int main() {
    vector<vector<int>> v = {{0,6,0},{5,8,7},{0,9,0}};
    Solution ob;
    cout << ob.getMaximumGold(v);
}

ইনপুট

[[0,6,0],[5,8,7],[0,9,0]]

আউটপুট

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

  2. C++-এ ৮ সংখ্যা গ্রিডে শর্ত মেনে রাখা বসান

  3. C++-এ বাইনারি ট্রিতে সর্বোচ্চ পথ যোগফল

  4. পাইথনে পাথ উইথ ম্যাক্সিমাম মিনিমাম ভ্যালু