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

০১ ম্যাট্রিক্সে নিকটতম ০-এর দূরত্ব C++-এ

সমস্যা বিবরণ

একটি বাইনারি ম্যাট্রিক্স (০ ও ১) দেওয়া আছে। প্রতিটি সেলের জন্য নিকটতম ০-এর দূরত্ব বের করতে হবে। আড়াআড়ি সেলের দূরত্ব ১ বিবেচিত।

উদাহরণ

ইনপুট:

000
010
111

আউটপুট:

000
010
121

অ্যালগরিদম: Multi-source BFS

সকল ০-সেলকে একসাথে কিউতে পুশ করুন (ডিস্ট্যান্স ০)। তারপর BFS চালিয়ে লেভেল বাই লেভেল ১-সেলগুলোর দূরত্ব আপডেট করুন। এটি নিশ্চিত করে যে প্রথমবারের মতো পৌঁছানো হয়ে থাকে সেটাই নিকটতম দূরত্ব।

ধাপসমূহ:

  1. দিক নির্দেশ অ্যারে: dir = {{1,0}, {-1,0}, {0,-1}, {0,1}}
  2. রেজাল্ট ম্যাট্রিক্স ret ইনфиниটি দিয়ে ইনিশিয়ালাইজ করুন।
  3. সব ০-সেলের জন্য ret=0 এবং কিউতে পুশ করুন।
  4. লেভেল = ১ থেকে শুরু করে কিউ খালি না হওয়া পর্যন্ত:
    • বর্তমান লেভেলের সব নোড প্রসেস করুন।
    • চার দিকের প্রতিটি প্রতিবেশী için:
      • বৈধ সেল কিনা চেক করুন।
      • যদি ret[nx][ny] < level হয়, তবে ইতিমধ্যে ভালো পথ পাওয়া গেছে → স্কিপ করুন।
      • অন্যথায় ret[nx][ny] = level সেট করে কিউতে পুশ করুন।

C++ বাস্তবায়ন

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

int dir[4][2] = {{1,0}, {-1,0}, {0,-1}, {0,1}};

class Solution {
public:
    vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
        int n = matrix.size();
        int m = matrix[0].size();
        vector<vector<int>> ret(n, vector<int>(m, INT_MAX));
        queue<pair<int,int>> q;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (!matrix[i][j]) {
                    ret[i][j] = 0;
                    q.push({i, j});
                }
            }
        }

        for (int lvl = 1; !q.empty(); lvl++) {
            int sz = q.size();
            while (sz--) {
                auto [x, y] = q.front(); q.pop();
                for (int k = 0; k < 4; k++) {
                    int nx = x + dir[k][0];
                    int ny = y + dir[k][1];
                    if (nx < 0 || nx >= n || ny < 0 || ny >= m || ret[nx][ny] < lvl) continue;
                    ret[nx][ny] = lvl;
                    q.push({nx, ny});
                }
            }
        }
        return ret;
    }
};

int main() {
    Solution ob;
    vector<vector<int>> v = {{0,0,0},{0,1,0},{1,1,1}};
    auto res = ob.updateMatrix(v);
    // প্রিন্ট করুন
    return 0;
}

ইনপুট ও আউটপুট

ইনপুটআউটপুট
{{0,0,0},{0,1,0},{1,1,1}}[[0,0,0],[0,1,0],[1,2,1]]

জটিলতা বিশ্লেষণ

  • সময় জটিলতা: O(n×m) — প্রতিটি সেল একবার ভিজিট করা হয়।
  • স্থান জটিলতা: O(n×m) — রেজাল্ট ম্যাট্রিক্স ও কিউর জন্য।
  1. C++-এ ম্যাট্রিক্সের জিগজ্যাগ (ডায়াগোনাল) ট্রাভার্সাল

  2. সি++-এ স্পায়রাল ম্যাট্রিক্স III (Spiral Matrix III)

  3. C++-এ আইডেমপটেন্ট ম্যাট্রিক্স যাচাই করার প্রোগ্রাম

  4. C++-এ static_cast