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

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


ধরুন আমাদের একটি NxN চেসবোর্ড আছে, একটি ঘোড়া r-তম সারি এবং c-তম কলাম থেকে শুরু করে সঠিকভাবে K চলে যাওয়ার চেষ্টা করে। এখানে সারি এবং কলাম ০-ইন্ডেক্সড, তাই উপরের বাম কোণা (০, ০), এবং নিচের ডান কোণা (N-১, N-১)।

একটি ঘোড়া একটি কক্ষ থেকে ৮টি ভিন্ন কক্ষে যেতে পারে, যা এই ডায়াগ্রামে দেখানো হয়েছে −

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

প্রতিবার ঘোড়া যাওয়ার সময়, এটি আটটি সম্ভাব্য যাওয়ার中略 থেকে যাদুকরীভাবে একটি বেছে নেয়। ঘোড়া চলতে থাকে যতক্ষণ না এটি সঠিকভাবে K চলে যায় বা চেসবোর্ডের বাইরে চলে যায়। আমাদের বোর্ডে থাকার সম্ভাবনা বের করতে হবে।

তাই যদি ইনপুট হয় 3, 2, 0, 0, তবে আউটপুট হবে 0.0625। কারণ দুটি যাওয়া ( (1,2), (2,1) ) ঘোড়াকে বোর্ডে রাখবে। এখন সেই প্রতিটি অবস্থান থেকে, আরও দুটি যাওয়া ঘোড়াকে বোর্ডে রাখবে। তাই মোট সম্ভাবনা 0.0625।

এটি সমাধান করতে আমরা নিম্নলিখিত ধাপগুলি অনুসরণ করব −

  • একটি দিক অ্যারে dir সংজ্ঞায়িত করুন, এটি হল [[-2,-1], [-2, 1],[2,-1], [2, 1], [1,2], [1,-2], [-1,2], [-1,-2]]
  • একটি রিকার্সিভ মেথড solve() সংজ্ঞায়িত করুন, এটি x, y, n, k, এবং 3D অ্যারে dp নেবে
  • যদি x >= n বা y >= n বা x < 0 বা y < 0, তবে ০ ফেরত দিন
  • যদি k ০ হয়, তবে ১ ফেরত দিন
  • যদি dp[k,x,y] -1 না হয়, তবে dp[k,x,y] ফেরত দিন
  • dp[k, x, y] := ০
  • i = 0 থেকে ৭ পর্যন্ত
    • dp[k,x,y] := solve(x+dir[i,0], y + dir[i, 1], n, k – 1, dp)
  • dp[k,x,y] ফেরত দিন
  • মূল মেথড থেকে, নিম্নলিখিত কাজ করুন
  • (k + 1) x N x N আকারের একটি 3D অ্যারে তৈরি করুন। এটি -1 দিয়ে পূরণ করুন
  • solve(r, c, N, k, dp) / (8^K) ফেরত দিন

বेहतर বোঝার জন্য নিচের ইমপ্লিমেন্টেশনটি দেখুন −

উদাহরণ

#include <bits/stdc++.h> using namespace std; int dir[8][2] = {{-2, -1}, {-2, 1}, {2, -1}, {2, 1}, {1, 2}, {1, -2}, {-1, 2}, {-1, -2}}; class Solution {    public:    double solve(int x, int y, int n, int k, vector < vector < vector < double > > >& dp){       if(x >= n || y >= n || x < 0 || y < 0 ) return 0.0;       if(k == 0) return 1.0;       if(dp[k][x][y] != -1) return dp[k][x][y];       dp[k][x][y] = 0;       for(int i = 0; i < 8; i++){          dp[k][x][y] += solve(x + dir[i][0], y + dir[i][1], n, k - 1, dp);       }       return dp[k][x][y];    }    double knightProbability(int N, int K, int r, int c) {       vector < vector < vector < double > > > dp (K + 1, vector < vector < double > >(N, vector < double >(N, -1))) ;       return solve(r, c, N, K, dp) / pow(8, K);    } }; main(){    Solution ob;    cout << (ob.knightProbability(3, 2, 0, 0)); }

ইনপুট

3 2 0 0

আউটপুট

0.0625

  1. C++-এ N*N চেসবোর্ডে সর্বোচ্চ বিশপ বসানো

  2. সি++-এ অ্যারেতে একটি কী (Key) থাকার প্রোবাবিলিটি বের করার প্রোগ্রাম

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

  4. N টি সিক্কা টস করে কমপক্ষে K টি হেড পাওয়ার সম্ভাবনা C++-তে