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

C++-এ নাইটের ন্যূনতম মুভ গণনা করুন


ধরুন আমাদের একটি অসীম চেসবোর্ড আছে যার কোঅরডিনেট -ইনফিনিটি থেকে +ইনফিনিটি, এবং [0, 0] স্কোয়ারে একটি নাইট আছে। নাইটের ৮টি সম্ভাব্য মুভ থাকে, যা নিচে দেখানো হলো। প্রতিটি মুভ কার্ডিনাল ডিরেকশনে দুটি স্কোয়ার, তারপর অর্থোগোনাল ডিরেকশনে একটি স্কোয়ার।

C++-এ নাইটের ন্যূনতম মুভ গণনা করুন

আমাদের [x, y] স্কোয়ারে নাইটটি পৌঁছাতে ন্যূনতম স্টেপ সংখ্যা খুঁজে বের করতে হবে। উত্তর অস্তিত্বের গ্যারান্টি দেওয়া আছে।

যেন ইনপুট x = 5 এবং y = 5, তবে আউটপুট হবে 4। পথটি হবে: [0,0] → [2,1] → [4,2] → [3,4] → [5,5]

সমাধান পদ্ধতি

  • একটি ম্যাপ m ডিফাইন করুন
  • solve() মেথড ডিফাইন করুন, যা x এবং y নেবে
  • যদি x + y = 0, তবে 0 রিটার্ন করুন; যদি x + y = 2, তবে 2 রিটার্ন করুন
  • (x, y) ব্যবহার করে একটি পেয়ার temp বানান
  • যদি m-এ temp পেয়ারটি থাকে, তবে m[temp] রিটার্ন করুন
  • m[temp] := min(solve(|x-1|, |y-2|), solve(|x-2|, |y-1|)) + 1 রিটার্ন করুন
  • মেইন মেথড থেকে solve(|x|, |y|) কল করুন এবং মানটি রিটার্ন করুন

উদাহরণ (C++)

নিচের ইমপ্লিমেন্টেশনটি দেখুন ভালো বুঝতে -

#include <bits/stdc++.h> using namespace std; class Solution { public:    map < pair <int, int>, int > dp;    int solve(int x, int y){       if(x + y == 0) return 0;       if (x + y == 2) return 2;       pair <int, int> temp({x, y});       if(dp.count(temp)) return dp[temp];       return dp[temp] = min(solve(abs(x - 1), abs(y - 2)), solve(abs(x - 2), abs(y - 1))) + 1;    }    int minKnightMoves(int x, int y) {       return solve(abs(x), abs(y));    } }; int main(){    Solution ob;    cout << (ob.minKnightMoves(5, 5)); }

ইনপুট

5 5

আউটপুট

4

  1. C++-এ বাইনারি ট্রির মিনিমাম ডেপথ (Minimum Depth of Binary Tree)

  2. C++-এ চেসবোর্ডে ঘোড়ার সম্ভাবনা

  3. অনন্ত নাম্বার লাইনে লক্ষ্যে যেতে ন্যূনতম মুভের সংখ্যা বের করা C++-তে

  4. C++ ব্যবহার করে অ্যারের সব এলিমেন্ট সমান করতে ন্যূনতম মুভ সংখ্যা