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

পাইথনে ২D গ্রিডে সবচেয়ে কম দূরত্বে সব মানুষকে মিলাতে বসানো (BFS + অপ্টিমাইজেশন)

এক ২D ম্যাট্রিক্স দেওয়া: ০=খালি সেল, ১=উত্তাল/ওয়াল, ২=মানুষ। মানুষ উপ-ডান-বাম-চাপে যেতে পারে। এমন একটি সেল (যেটি ওয়াল নয়) খুঁজতে হবে যাতে সব মানুষের ট্রাভেল দূরত্বের যোগফল ন্যূনতম হয়।

উদাহরণ: [[2,0,1,0],[1,0,1,2],[0,0,2,2]] → আউটপুট 7 (বেস্ট মিটিং পয়েন্ট: বটম-রাইট কর্নার)।

মাল্টি-সোর্স BFS সমাধান

  1. সব মানুষের লোকেশন (2) খুঁজে বের করুন।
  2. প্রতিটি মানুষের জন্য BFS চালিয়ে সেটি থেকে সব সেল পর্যন্ত দূরত্ব costs ম্যাট্রিক্সে স্টোর করুন।
  3. প্রতিটি সেল (যেটি ওয়াল নয়) এর জন্য সব মানুষের দূরত্ব যোগ করুন।
  4. ন্যূনতম যোগফল বের করুন।

পাইথন কোড

class Solution:
    def solve(self, matrix):
        twos = {}
        costs = {}
        for i, r in enumerate(matrix):
            for j, v in enumerate(r):
                if v == 2:
                    twos[(i, j)] = [(i, j, 0)]
                    costs[(i, j)] = [[1e9]*len(matrix[0]) for _ in matrix]
        
        for k, q in twos.items():
            seen = set()
            while q:
                i, j, cost = q.pop(0)
                if (i, j) in seen:
                    continue
                seen.add((i, j))
                costs[k][i][j] = cost
                for di, dj in ((1,0), (-1,0), (0,1), (0,-1)):
                    ni, nj = i+di, j+dj
                    if 0 <= ni < len(matrix) and 0 <= nj < len(matrix[0]) and matrix[ni][nj] != 1:
                        q.append((ni, nj, cost+1))
        
        ans = 1e9
        for i in range(len(matrix)):
            for j in range(len(matrix[0])):
                cur_cost = sum(arr[i][j] for arr in costs.values())
                ans = min(ans, cur_cost)
        return ans

ob = Solution()
matrix = [[2,0,1,0], [1,0,1,2], [0,0,2,2]]
print(ob.solve(matrix))  # 7

টাইম কমপ্লেক্সিটি: O(P × R × C) (P = মানুষের সংখ্যা, R×C = গ্রিড আকার)। বড় গ্রিডের জন্য অপ্টিমাইজেশন দরকার।

  1. পাইথনে সব পয়েন্ট কানেক্ট করার ন্যূনতম খরচ বের করার প্রোগ্রাম

  2. Python দিয়ে সব নোডে পৌঁছাতে মিনিমাম ভার্টেক্স বের করার প্রোগ্রাম

  3. পাইথনে ভালো পারফরমারদের ন্যূনতম বেতন বের করার প্রোগ্রাম

  4. পাইথন প্রোগ্রাম: স্ট্রিং রি-অ্যারেঞ্জ করা যাতে সব সেম ক্যারেক্টার d দূরত্বে থাকে