h x w সাইজের একটি গ্রিড দেওয়া আছে যেখানে '#' = বাধা, '.' = পথ। রোবট কোঅর্ডিনেট c = (x,y) থেকে d = (p,q) যেতে চায়। রোবটের মুভমেন্ট নিয়ম:
- উপর/নিচে/ডানে/বামে সন্নিকট সেলে যেতে পারে (কোস্ট ০ জাম্প)।
- বর্তমান সেলকে কেন্দ্র করে ৫x৫ এরিয়ার যেকোনো সেলে জাম্প দিয়ে যেতে পারে (কোস্ট ১ জাম্প)।
- বাধায় যাওয়া যায় না, গ্রিডের বাইরে যাওয়া যায় না।
গন্তব্যে পৌঁছাতে ন্যূনতম জাম্প সংখ্যা বের করুন।
উদাহরণ
ইনপুট: h=4, w=4, c={2,1}, d={4,4}, grid = {"#...",".##.", "...#", "..#."}
আউটপুট: 1 (শুধু ১ জাম্পে গিয়ে পৌঁছানো যায়)
অ্যালগরিদম (০-১ BFS / Deque BFS)
dst[i][j]= নোড(i,j)-এ পৌঁছাতে লাগা ন্যূনতম জাম্প।- শুরুতে সব
INF, শুধু সোর্সে ০। dequeব্যবহার: কোস্ট ০ वाले নোডpush_front, কোস্ট ১ वालेpush_back।- প্রতিটি নোড থেকে ৫x৫ এরিয়ার চেক করুন:
|dx| + |dy| > 1হলে জাম্প (কোস্ট ১), নয় তবে ওক (কোস্ট ০)। - যখন গন্তব্যে পৌঁছায়,
dstপ্রিন্ট করুন।
C++ প্রোগ্রাম
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
#define N 100
int h, w;
pair<int,int> s, t;
string grid[N];
int dst[N][N];
struct node { int a, b, e; };
bool check(int a, int b) {
return a >= 0 && a < h && b >= 0 && b < w;
}
void bfs(int a, int b) {
for (int i = 0; i < h; i++)
for (int j = 0; j < w; j++)
dst[i][j] = INF;
dst[a][b] = 0;
deque<node> dq;
dq.push_back({a, b, 0});
while (!dq.empty()) {
node nd = dq.front(); dq.pop_front();
if (nd.e > dst[nd.a][nd.b]) continue;
for (int dx = -2; dx <= 2; dx++) {
for (int dy = -2; dy <= 2; dy++) {
int tm = abs(dx) + abs(dy);
int nx = nd.a + dx, ny = nd.b + dy;
if (check(nx, ny) && grid[nx][ny] == '.') {
int w = (tm > 1) ? 1 : 0;
if (dst[nd.a][nd.b] + w < dst[nx][ny]) {
dst[nx][ny] = dst[nd.a][nd.b] + w;
if (w == 0) dq.push_front({nx, ny, dst[nx][ny]});
else dq.push_back({nx, ny, dst[nx][ny]});
}
}
}
}
}
}
void solve(pair<int,int> c, pair<int,int> d, string initGrid[]) {
s = c; t = d;
s.first--; s.second--; t.first--; t.second--;
for (int i = 0; i < h; i++) grid[i] = initGrid[i];
bfs(s.first, s.second);
cout << (dst[t.first][t.second] == INF ? -1 : dst[t.first][t.second]) << '\n';
}
int main() {
h = 4; w = 4;
pair<int,int> c = {2,1}, d = {4,4};
string initGrid[] = {"#...", ".##.", "...#", "..#."};
solve(c, d, initGrid);
return 0;
}
আউটপুট
1
মূল পয়েন্ট
- ০-১ BFS ডিক utiliza করে স্ট্রেটএজ এবং জাম্প আলাদা হ্যান্ডেল করা হয়।
- সাধারণ BFS (কিউ) দিয়ে ও করা যায় কিন্তু ০-১ BFS দ্রুত।
- গ্রিড সাইজ ১০০x১০০ পর্যন্ত এই কোড কাজ করবে।