সমস্যা বিবরণ
একটি বাইনারি ম্যাট্রিক্স (০ ও ১) দেওয়া আছে। প্রতিটি সেলের জন্য নিকটতম ০-এর দূরত্ব বের করতে হবে। আড়াআড়ি সেলের দূরত্ব ১ বিবেচিত।
উদাহরণ
ইনপুট:
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 1 | 1 |
আউটপুট:
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 2 | 1 |
অ্যালগরিদম: Multi-source BFS
সকল ০-সেলকে একসাথে কিউতে পুশ করুন (ডিস্ট্যান্স ০)। তারপর BFS চালিয়ে লেভেল বাই লেভেল ১-সেলগুলোর দূরত্ব আপডেট করুন। এটি নিশ্চিত করে যে প্রথমবারের মতো পৌঁছানো হয়ে থাকে সেটাই নিকটতম দূরত্ব।
ধাপসমূহ:
- দিক নির্দেশ অ্যারে:
dir = {{1,0}, {-1,0}, {0,-1}, {0,1}} - রেজাল্ট ম্যাট্রিক্স
retইনфиниটি দিয়ে ইনিশিয়ালাইজ করুন। - সব ০-সেলের জন্য
ret=0এবং কিউতে পুশ করুন। - লেভেল = ১ থেকে শুরু করে কিউ খালি না হওয়া পর্যন্ত:
- বর্তমান লেভেলের সব নোড প্রসেস করুন।
- চার দিকের প্রতিটি প্রতিবেশী 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) — রেজাল্ট ম্যাট্রিক্স ও কিউর জন্য।