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

বক্স স্ট্যাকিং সমস্যা (Box Stacking Problem)

এই সমস্যায় বিভিন্ন বক্সের একটি সেট দেওয়া থাকে, যাদের দৈর্ঘ্য, প্রস্থ এবং উঁচু ভিন্ন হতে পারে। আমাদের কাজ হলো একটি বক্স স্ট্যাক খুঁজে বের করা যাতে এর উঁচু όσο সম্ভব বেশি হয়। আমরা ইচ্ছেমতো কোনো বক্সকে ঘুরিয়ে দিতে পারি। কিন্তু একটি নিয়ম মানতে হবে।

একটি বক্সকে অন্য বক্সের ওপর রাখা যাবে যদি নিচের বক্সের উপরের সারফেসের এলাকা উপরের বক্সের নিচের এলাকার চেয়ে বড় হয়।

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

ইনপুট: বক্সের একটি লিস্ট দেওয়া আছে। প্রতিটি বক্সকে (length, breadth, height) দিয়ে চিহ্নিত করা হয়।
{ (4, 6, 7), (1, 2, 3), (4, 5, 6), (10, 12, 32) }
আউটপুট: বক্স স্ট্যাকের সর্বাধিক সম্ভাব্য উঁচু: 60

এলগরিদম

maxHeight(boxList, n)

ইনপুট: ভিন্ন বক্সের তালিকা, বক্সের সংখ্যা।

আউটপুট: বক্স স্ট্যাকিং দিয়ে পাওয়া সর্বাধিক উঁচু।

শুরু
  3n আকারের একটি রোটেশন অ্যারে rot সংজ্ঞায়িত করুন।
  index := 0
  boxList-এ সব বক্স i এর জন্য, করুন
    rot[index].len := boxList[i].len
    rot[index].hei := max(boxList[i].hei, boxList[i].bre)
    rot[index].bre := min(boxList[i].hei, boxList[i].bre)
    index := index + 1
    rot[index].len := boxList[i].bre
    rot[index].hei := max(boxList[i].len, boxList[i].hei)
    rot[index].bre := min(boxList[i].len, boxList[i].hei)
    index := index + 1
    rot[index].len := boxList[i].hei
    rot[index].hei := max(boxList[i].len, boxList[i].bre)
    rot[index].bre := min(boxList[i].len, boxList[i].bre)
    index := index + 1
  n := 3n
  rot লিস্টকে সর্ট করুন
  maxHeightTemp অ্যারে সংজ্ঞায়িত করুন
  i := 1 থেকে n-1 পর্যন্ত, করুন
    j := 0 থেকে i-1 পর্যন্ত, করুন
      যদি rot[i].bre < rot[j].bre এবং
        rot[i].hei < rot[j].hei এবং
        maxHeightTemp[i] < maxHeightTemp[j] + rot[i].len, তবে
        maxHeightTemp[i] := maxHeightTemp[j] + rot[i].len
      শর্ত শেষ
    শেষ লুপ
  শেষ লুপ
  maxHeight := -1
  i := 0 থেকে n-1 পর্যন্ত, করুন
    যদি maxHeight < maxHeightTemp[i], তবে
      maxHeight := maxHeightTemp[i]
    শর্ত শেষ
  শেষ লুপ
  return maxHeight
শেষ

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

#include <iostream>
#include <algorithm>
using namespace std;

struct Box {
  int length, breadth, height;
};

int min(int x, int y) {
  return (x < y) ? x : y;
}

int max(int x, int y) {
  return (x > y) ? x : y;
}

bool compare(Box b1, Box b2) {
  return b1.height > b2.height;  // বক্সকে উঁচু অনুযায়ী ডিসেন্ডিং অর্ডারে সর্ট করতে
}

int maxHeight(Box boxList[], int n) {
  Box rotation[3*n];  // একটি বক্স ৩ ভাবে ঘুরানো যায়, তাই ৩n সংখ্যক রোটেশন
  int index = 0;
  for (int i = 0; i < n; i++) {
    // বক্সের প্রাথমিক অবস্থা স্টোর করুন
    rotation[index].length = boxList[i].length;
    rotation[index].height = max(boxList[i].height, boxList[i].breadth);
    rotation[index].breadth = min(boxList[i].height, boxList[i].breadth);
    index++;
    // প্রথম রোটেশনের পর ডাইমেনশন
    rotation[index].length = boxList[i].breadth;
    rotation[index].height = max(boxList[i].length, boxList[i].height);
    rotation[index].breadth = min(boxList[i].length, boxList[i].height);
    index++;
    // দ্বিতীয় রোটেশনের পর ডাইমেনশন
    rotation[index].length = boxList[i].height;
    rotation[index].height = max(boxList[i].length, boxList[i].breadth);
    rotation[index].breadth = min(boxList[i].length, boxList[i].breadth);
    index++;
  }
  n = 3*n;  // প্রতিটি বক্সের ৩টি রোটেশনের জন্য n কে 3n হিসেবে সেট করুন
  sort(rotation, rotation+n, compare);  // রোটেশন অ্যারেকে ডিসেন্ডিং অর্ডারে সর্ট করুন
  int maxHTemp[n];  // 임시 max height যদি i-তম বক্স স্ট্যাক করা হয়
  for (int i = 0; i < n; i++)
    maxHTemp[i] = rotation[i].length;
  for (int i = 1; i < n; i++)  // অপ্টিমাইজড স্ট্যাক উঁচু খুঁজে বের করুন
    for (int j = 0; j < i; j++)
      if (rotation[i].breadth < rotation[j].breadth &&
          rotation[i].height < rotation[j].height &&
          maxHTemp[i] < maxHTemp[j] + rotation[i].length) {
        maxHTemp[i] = maxHTemp[j] + rotation[i].length;
      }
  int maxHeight = -1;
  for (int i = 0; i < n; i++)  // সব টেম্পোরারি উঁচু থেকে সর্বোচ্চ উঁচু খুঁজে বের করুন
    if (maxHeight < maxHTemp[i])
      maxHeight = maxHTemp[i];
  return maxHeight;
}

int main() {
  Box arr[] = {{4, 6, 7}, {1, 2, 3}, {4, 5, 6}, {10, 12, 32}};
  int n = 4;
  cout << "The maximum possible height of box stack is: " << maxHeight(arr, n) << endl;
}

আউটপুট

The maximum possible height of box stack is: 60
  1. র্যাট ইন ए মেজ সমস্যা

  2. M-কালারিং সমস্যা

  3. স্নেক অ্যান্ড ল্যাডার সমস্যা (Snake and Ladder Problem)

  4. ভার্টেক্স কভার সমস্যা (Vertex Cover Problem)