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

C++-এ সেরা মিটিং পয়েন্ট (Best Meeting Point) বের করা


ধরি দুজন বা অধিক মানুষের একটি গোষ্ঠী আছে যারা মিলতে চায় এবং মোট ভ্রমণ দূরত্ব ন্যূনতম করতে চায়। আমাদের একটি 2D গ্রিড আছে যার মান 0 বা 1, যেখানে 1 মানে কোনো কাউকে বাসা। দূরত্ব ম্যানহ্যাটান ডিস্ট্যান্স (Manhattan Distance) দিয়ে বের করা হয়: distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|।

উদাহরণস্বরূপ, গ্রিড:

10001
00000
00100

আউটপুট হবে 6 কারণ তিনজন মানুষ থাকে (0,0), (0,4), এবং (2,2)-এ। পয়েন্ট (0,2) আদর্শ মিটিং পয়েন্ট, কারণ মোট দূরত্ব 2+2+2=6 ন্যূনতম।

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

  • get(v) ফাংশন:
    • v সর্ট করা
    • i := 0, j := v.size()-1, ret := 0
    • যখন i < j:
      • ret += v[j] - v[i]
      • i++; j--
    • ret ফেরত
  • মেইন মেথড:
    • দুটি অ্যারে row এবং col
    • গ্রিডের সব সেল (i,j) জন্য যদি grid[i][j] != 0: row.push_back(i), col.push_back(j)
    • ফেরত: get(row) + get(col)

প্রোগ্রাম উদাহরণ

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

class Solution {
public:
    int minTotalDistance(vector>& grid) {
        vector row;
        vector col;
        for (int i = 0; i < grid.size(); i++) {
            for (int j = 0; j < grid[0].size(); j++) {
                if (grid[i][j]) {
                    row.push_back(i);
                    col.push_back(j);
                }
            }
        }
        return get(row) + get(col);
    }
    int get(vector v) {
        sort(v.begin(), v.end());
        int i = 0;
        int j = v.size() - 1;
        int ret = 0;
        while (i < j) {
            ret += v[j] - v[i];
            i++;
            j--;
        }
        return ret;
    }
};

int main() {
    Solution ob;
    vector> v = {{1,0,0,0,1},{0,0,0,0,0},{0,0,1,0,0}};
    cout << (ob.minTotalDistance(v));
}

ইনপুট

{{1,0,0,0,1},{0,0,0,0,0},{0,0,1,0,0}}

আউটপুট

6
  1. সি++ কোড: মিটিং-এর পর ন্যূনতম ক্লান্তি বের করুন

  2. ২-ডি প্লেনে একটি পয়েন্টের মিরর ইমেজ খুঁজে বের করা C++-এ

  3. C++-তে ২ বা ৩ ধাপ চলে একটি পয়েন্টে পৌঁছানোর প্রোবাবিলিটি

  4. C++-এ একটি পয়েন্টকে অন্য পয়েন্টের সাপেক্ষে ঘুরানো (Rotation)