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

সি++-এ বড়ते জলে তাড়না (Swim in Rising Water)

মনে করুন, একটি N x N গ্রিড আছে, যেখানে grid[i][j] उस বিন্দুর (i,j) উচ্চতা নির্দেশ করে। এখন বৃষ্টি শুরু হয়েছে। সময় t-এ পানির গভীরতা সব জায়গায় t। আমরা একটি বর্গ থেকে অন্য ৪-দিকের যেকোনো সন্নিহিত বর্গে তখনই তাড়তে পারি যখন দুটি বর্গের উচ্চতা টি t-র চেয়ে কম বা সমান হয়। আমরা শূন্য সময়ে অসীম দুরি তাড়তে পারি।

আমরা (0, 0) থেকে শুরু করব। নিচের ডান কোণার বর্গ (N-1, N-1)-এ পৌঁছানোর জন্য ন্যূনতম সময় বের করতে হবে।

সমাধানের ধাপসমূহ

  • Data স্ট্রাকচার সংজ্ঞায়িত করুন: time, x, y
  • দিক নির্দেশক অ্যারে dir := {{1,0}, {-1,0}, {0,1}, {0,-1}}
  • n := grid.size(), m := grid[0].size()
  • প্রায়োরিটি কিউ q এবং n x m আকারের visited অ্যারে (০ দিয়ে ভরা) সংজ্ঞায়িত করুন
  • visited[0][0] := 1, q-তে Data(grid[0][0], 0, 0) ঢুকান
  • যখন q খালি নয়
    • node := q.top(), q.pop()
    • time := node.time, x := node.x, y := node.y
    • যদি x == n-1 && y == m-1 হয়, time রিটার্ন করুন
    • চারটি দিকের জন্য
      • nx := x + dir[i][0], ny := y + dir[i][1]
      • যদি বৈধ হয় এবং visited[nx][ny] == 0 হয়
        • visited[nx][ny] := 1
        • q-তে Data(max(grid[nx][ny], time), nx, ny) ঢুকান
  • -1 রিটার্ন করুন

উদাহরণ

#include <bits/stdc++.h> using namespace std; struct Data{    int time, x, y;    Data(int a, int b, int y){       time = a;       x = b;       this->y = y;    } }; struct Comparator{    bool operator()(Data a, Data b){       return !(a.time < b.time);    } }; int dir[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1}}; class Solution { public:    int swimInWater(vector<vector<int>>& grid) {       int n = grid.size();       int m = grid[0].size();       priority_queue <Data, vector <Data>, Comparator> q;       vector < vector <int> > visited(n, vector <int>(m, 0));       visited[0][0] = 1;       q.push(Data(grid[0][0], 0, 0));       while(!q.empty()){          Data node = q.top();          q.pop();          int time = node.time;          int x = node.x;          int y = node.y;          if(x == n - 1 && y == m - 1)return time;          for(int i = 0; i < 4; i++){             int nx = dir[i][0] + x;             int ny = dir[i][1] + y;             if(nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny]){                visited[nx][y] = 1;                q.push(Data(max(grid[nx][ny], time), nx, ny));             }          }       }       return -1;    } }; main(){    Solution ob;    vector<vector<int>> v = {{0,1,2,3,4},{24,23,22,21,5},{12,13,15,15,16},{11,17,18,19,20},   {10,9,8,7,6}};    cout << (ob.swimInWater(v)); }

ইনপুট

{{0,1,2,3,4},{24,23,22,21,5},{12,13,15,15,16},{11,17,18,19,20},{10,9,8,7,6}}

আউটপুট

16
  1. C++-এ ডায়াগোনাল ট্রায়ভার্স II

  2. প্রসেস কিল করা (Kill Process) C++-এ

  3. স্কোয়ারেল সিমুলেশন (Squirrel Simulation) C++-এ

  4. C++-এ আয়তাকার এলাকা II (Rectangle Area II) সমাধান