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

এগ ড্রপিং পাজল (Egg Dropping Puzzle)

এটি একটি বিখ্যাত পাজল সমস্যা। ধরুন একটি বিল্ডিং আছে n তলার, যদি আমাদের m টি ডিম থাকে, তবে আমরা কিভাবে ন্যূনতম ড্রপ দিয়ে সেই তলা খুঁজে বের করব যেখান থেকে ডিম ড্রপ করলে সেটি ভাঙবে না।

কিছু গুরুত্বপূর্ণ পয়েন্ট মনে রাখতে হবে −

  • যদি একটি ডিম কোনো তলা থেকে না ভাঙে, তবে সেটি যেকোনো নিচের তলা থেকেও ভাঙবে না।
  • যদি একটি ডিম কোনো তলা থেকে ভাঙে, তবে সেটি সব উপরের তলা থেকেও ভাঙবে।
  • যদি ডিম ভাঙে, তবে সেটি ফেলে দিতে হবে, অন্যথায় আবার ব্যবহার করা যাবে।

ইনপুট এবং আউটপুট

ইনপুট: ডিমের সংখ্যা এবং সর্বোচ্চ তলা।
মান লইয়ে নিই ডিম ৪টি এবং সর্বোচ্চ তলা ১০।
আউটপুট: Enter number of eggs: 4
Enter max Floor: 10
Minimum number of trials: 4

এলগরিদম

eggTrialCount(eggs, floors)

ইনপুট: ডিমের সংখ্যা, সর্বোচ্চ তলা।

আউটপুট: ন্যূনতম ট্রায়ালের সংখ্যা পান।

শুরু
  [eggs+1, floors+1] আকারের একটি ম্যাট্রিক্স সংজ্ঞায়িত করুন
  i := 1 থেকে eggs পর্যন্ত, করুন
    minTrial[i, 1] := 1
    minTrial[i, 0] := 0
  শেষ লুপ
  j := 1 থেকে floors পর্যন্ত, করুন
    minTrial[1, j] := j
  শেষ লুপ
  i := 2 থেকে eggs পর্যন্ত, করুন
    j := 2 থেকে floors পর্যন্ত, করুন
      minTrial[i, j] := ∞
      k := 1 থেকে j পর্যন্ত, করুন
        res := 1 + max(minTrial[i-1, k-1] এবং minTrial[i, j-k]) এর
        যদি res < minTrial[i, j], তবে
          minTrial[i, j] := res
      শেষ লুপ
    শেষ লুপ
  শেষ লুপ
  return minTrial[eggs, floors]
শেষ

উদাহরণ (C++ কোড)

#include <iostream>
using namespace std;

int max(int a, int b) {
  return (a > b) ? a : b;
}

int eggTrialCount(int eggs, int floors) {
  // ওয়ার্স্ট কেসের জন্য ন্যূনতম ট্রায়াল
  int minTrial[eggs+1][floors+1];  // i-তম ডিম এবং j-তম তলার জন্য ন্যূনতম ট্রায়াল স্টোর করুন
  int res;
  for (int i = 1; i <= eggs; i++) {
    // প্রথম তলা থেকে চেক করতে ১ ট্রায়াল, এবং ০ তলার জন্য কোনো ট্রায়াল নেই
    minTrial[i][1] = 1;
    minTrial[i][0] = 0;
  }
  for (int j = 1; j <= floors; j++)  // যখন ডিম ১টি, প্রতিটি তলার জন্য ১ ট্রায়াল লাগে
    minTrial[1][j] = j;
  for (int i = 2; i <= eggs; i++) {
    // ২ বা ২-এর বেশি ডিমের জন্য
    for (int j = 2; j <= floors; j++) {
      // ২য় বা ২য়ের উপরের তলার জন্য
      minTrial[i][j] = INT_MAX;
      for (int k = 1; k <= j; k++) {
        res = 1 + max(minTrial[i-1][k-1], minTrial[i][j-k]);
        if (res < minTrial[i][j])
          minTrial[i][j] = res;
      }
    }
  }
  return minTrial[eggs][floors];  // চাওয়া ডিম এবং তলার জন্য ট্রায়ালের সংখ্যা
}

int main() {
  int egg, maxFloor;
  cout << "Enter number of eggs: "; cin >> egg;
  cout << "Enter max Floor: "; cin >> maxFloor;
  cout << "Minimum number of trials: " << eggTrialCount(egg, maxFloor);
}

আউটপুট

Enter number of eggs: 4
Enter max Floor: 10
Minimum number of trials: 4
  1. C#-এ Decimal.Floor() মেথড

  2. C#-এ Math.Floor() মেথড

  3. এগ ড্রপিং পাজলের পাইথন প্রোগ্রাম

  4. SQL Server-এ FLOOR ফাংশন