ধরুন, আমাদের একটি গ্রিড দেওয়া হয়েছে যাতে দুই ধরনের কোষ রয়েছে; কালো কোষ, এবং সাদা কোষ। কালো কোষগুলিকে '#' এবং সাদা কোষগুলিকে '.' হিসাবে উপস্থাপন করা হয়। গ্রিড স্ট্রিং একটি অ্যারে আমাদের দেওয়া হয়. এখন, আমাদের নিম্নলিখিতগুলি সম্পাদন করতে হবে৷
-
আমরা প্রতিটি সাদা কক্ষকে কালোতে রূপান্তর করি যার একটি পাশে একটি কালো কোষের সাথে ভাগ করা আছে। গ্রিডের প্রতিটি কক্ষ কালো না হওয়া পর্যন্ত আমরা এই অপারেশনটি করি৷
-
গ্রিডের সমস্ত কক্ষকে কালোতে রূপান্তর করতে যে পরিমাণ পুনরাবৃত্তি লাগে তা আমরা গণনা করি। শুরুতে গ্রিডে একটি কালো কক্ষ থাকতে হবে।
সুতরাং, যদি ইনপুটটি h =4, w =4, গ্রিড ={"#...", ".#.." , "....", "...#"}
| # | ৷ | ৷ | ৷ |
| ৷ | # | ৷ | ৷ |
| ৷ | ৷ | ৷ | ৷ |
| ৷ | ৷ | ৷ | # |
তাহলে আউটপুট হবে 3.
সমস্ত কোষকে কালোতে রূপান্তর করতে 3টি পুনরাবৃত্তি লাগে৷
পদক্ষেপ
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
Define an array dx of size: 4 containing := { 1, 0, - 1, 0 }
Define an array dy of size: 4 containing := { 0, 1, 0, - 1 }
Define one 2D array distance
Define one queue q that contain integer pairs
for initialize i := 0, when i < h, update (increase i by 1), do:
for initialize j := 0, when j < w, update (increase j by 1), do:
if grid[i, j] is same as '#', then:
distance[i, j] := 0
insert one pair(i, j) into q
while (not q is empty), do:
first element of auto now = q
delete element from q
for initialize dir := 0, when dir < 4, update (increase dir by 1), do:
cx := first value of now + dx[dir]
cy := second value of now + dy[dir]
if cx < 0 or cx >= h or cy < 0 or cy >= w, then:
if distance[cx, cy] is same as -1, then:
distance[cx, cy] := distance[first value of now, second value of now] + 1
insert one pair (cx, cy) into q
ans := 0
for initialize i := 0, when i < h, update (increase i by 1), do:
for initialize j := 0, when j < w, update (increase j by 1), do:
ans := maximum of ans and distance[i, j]
print(ans) উদাহরণ
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h>
using namespace std;
void solve(int h, int w, vector <string> grid){
int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };
vector<vector<int>> distance(h, vector<int>(w, -1));
queue<pair<int, int>> q;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if (grid[i][j] == '#') {
distance[i][j] = 0;
q.push(pair<int, int>(i,j));
}
}
}
while (!q.empty()) {
auto now = q.front();
q.pop();
for (int dir = 0; dir < 4; dir++) {
int cx = now.first + dx[dir];
int cy = now.second + dy[dir];
if (cx < 0 || cx >= h || cy < 0 || cy >= w) continue;
if (distance[cx][cy] == -1) {
distance[cx][cy] = distance[now.first][now.second] + 1;
q.push(pair<int, int> (cx, cy));
}
}
}
int ans = 0; for (int i = 0; i < h; ++i) {
for (int j = 0; j < w; ++j) {
ans = max(ans, distance[i][j]);
}
}
cout << ans << endl;
}
int main() {
int h = 4, w = 4; vector<string>
grid = {"#...", ".#.." , "....", "...#"};
solve(h, w, grid);
return 0;
} ইনপুট
4, 4, {"#...", ".#.." , "....", "...#"} আউটপুট
3