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

C++ में बढ़ते पानी में तैरना

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

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

तो अगर इनपुट पसंद है

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 होगा।

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

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

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

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

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

    1. C++ में आयत क्षेत्र II

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