Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में बढ़ते पानी में तैरना (Swim in Rising Water)


मान लीजिए हमारे पास एक N x N ग्रिड है, प्रत्येक वर्ग grid[i][j] उस बिंदु (i,j) पर ऊंचाई (elevation) को दर्शाता है। अब मान लीजिए बारिश शुरू हो गई है। समय t पर, हर जगह पानी की गहराई t है। हम एक वर्ग से दूसरे 4-दिशात्मक आसन्न वर्ग में तैर सकते हैं जब दोनों वर्गों की ऊंचाई व्यक्तिगत रूप से अधिकतम t हो। हम शून्य समय में अनंत दूरी तैर सकते हैं।

हमें स्थिति (0, 0) से शुरू करना चाहिए। हमें वह न्यूनतम समय ज्ञात करना है जब तक हम नीचे-दाएं वर्ग (N-1, N-1) तक पहुंच सकते हैं।

तो यदि इनपुट इस प्रकार है -

01234
242322215
1213151516
1117181920
109876

सही रास्ता रंगीन है। तो उत्तर 16 होगा।

इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे -

  • Data परिभाषित करें, यह तीन पैरामीटर लेगा जैसे time, x और y।
  • आकार 4 x 2 का एक ऐरे dir परिभाषित करें := { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }
  • n := grid की पंक्तियां, m := grid के स्तंभ
  • प्रायोरिटी क्यू q परिभाषित करें
  • आकार n x m का एक 2D ऐरे visited परिभाषित करें, इसे 0 से भरें
  • visited[0, 0] := 1
  • Data(grid[0, 0], 0, 0) को q में डालें
  • जब (q खाली नहीं है), करें -
    • node = q का शीर्ष तत्व और q से तत्व हटाएं
    • time := node का time
    • x := node का x, y := node का y
    • यदि x, n - 1 के समान है और y, m - 1 के समान है, तो -
      • time वापस करें
    • i := 0 से प्रारंभ करें, जब i < 4, i बढ़ाते हुए, करें -
      • nx := dir[i, 0] + x, ny := dir[i, 1] + y
      • यदि nx >= 0 और nx < n और ny >= 0 और ny < m और visited[nx, ny] नहीं है तो -
        • visited[nx, y] := 1
        • Data(grid[nx, ny] और time का अधिकतम, nx, ny) को q में डालें
  • -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++ में प्रोसेस मारें C++ में प्रोसेस मारें

    मान लीजिए हमारे पास n प्रोसेस हैं, यहां प्रत्येक प्रोसेस की एक अद्वितीय आईडी होती है जिसे PID या प्रोसेस आईडी कहा जाता है और इसका PPID (पैरेंट प्रोसेस आईडी) भी होता है। प्रत्येक प्रोसेस का केवल एक पैरेंट प्रोसेस होता है, लेकिन उसके एक या अधिक चाइल्ड प्रोसेस हो सकते हैं। यह एक ट्री संरचना की तरह है।

  1. C++ में गिलहरी सिमुलेशन C++ में गिलहरी सिमुलेशन

    एक पेड़, एक गिलहरी, और कई नट्स हैं। स्थितियों को 2D ग्रिड में सेल द्वारा दर्शाया जाता है। आपका लक्ष्य गिलहरी के लिए सभी नट्स को इकट्ठा करके उन्हें एक-एक करके पेड़ के नीचे रखने के लिए न्यूनतम दूरी ढूंढना है। गिलहरी एक समय में अधिकतम एक नट ले जा सकती है और चार दिशाओं में आगे बढ़ सकती है - ऊपर, नीचे,

  1. C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल C++ में आयत क्षेत्रफल II (Rectangle Area II) - ओवरलैपिंग आयतों का कुल क्षेत्रफल

    समस्या विवरण हमें अक्ष-संरेखित (axis-aligned) आयतों की एक सूची दी गई है। प्रत्येक आयत rectangle[i] = {x1, y1, x2, y2} द्वारा दर्शाया गया है, जहां (x1, y1) निचले-बाएं कोने का बिंदु है और (x2, y2) ऊपरी-दाएं कोने का बिंदु है। हमें तल (plane) में सभी आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ज्ञात करना