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

सी ++ में ग्रिड में दी गई दिशा में संभावित चालों की गणना करें

हम दो चर n और m हैं जो n x m आकार के ग्रिड का प्रतिनिधित्व करते हैं और प्रारंभिक बिंदु x, y से शुरू करते हैं।

कदमों/चालों के जोड़े भी दिए गए हैं जिन्हें चाल ((1,1), (2,2)) आदि के रूप में ग्रिड के अंदर ले जाया जा सकता है। चालों की प्रत्येक जोड़ी x,y अक्ष में उठाए गए कदमों की इकाई का प्रतिनिधित्व करती है। लक्ष्य कुल चरणों का पता लगाना है जो ग्रिड के अंदर सीमाओं के भीतर पार करने के लिए उठाए जा सकते हैं [1,n] एक्स [1, मी] यदि n 5 है और m 4 है और वर्तमान स्थिति 2,2 है और चुना गया चरण है ( 1,-1) तो एक बार इस कदम को उठाने से (3,1) हो जाएगा, इस कदम को फिर से उठाने पर (4,-1) हो जाएगा जो मान्य नहीं है क्योंकि -1 सीमा से बाहर है।

सी ++ में ग्रिड में दी गई दिशा में संभावित चालों की गणना करें

आइए उदाहरणों के साथ समझते हैं

इनपुट - ए =3, बी =4, एक्स =1, वाई =1; चालें ={ 1, 1}, { 0, -1}

आउटपुट − ग्रिड में दी गई दिशा में संभावित चालों की संख्या है − 4

स्पष्टीकरण -

Choosing move {1,1} = → (2,2) → (3,3) - 3 steps
Choosing move {0,-1} = → (3,2) → (3,1) - 2 steps
Total 4 steps.

इनपुट - ए =4, बी =4, एक्स =2, वाई =2; चालें ={ 2, 1 }, { -2, -3 }

आउटपुट - ग्रिड में दी गई दिशा में संभावित चालों की संख्या है - 1

स्पष्टीकरण

Choosing move {2,1} = → (4,3) - 1 step1
Choosing move {-2,-3} = → (2,0) X out of bound
Total 1 step

नीचे दिए गए प्रोग्राम में इस्तेमाल किया गया तरीका इस प्रकार है

इस दृष्टिकोण में हम जोड़ी के रूप में चरणों का प्रतिनिधित्व करने वाला एक वेक्टर बनाएंगे। बिंदु x, y से चलना प्रारंभ करें। सदिश से एक चरण चुनें और दोनों दिशाओं (x अक्ष और y अक्ष) में लिए गए मान का न्यूनतम चुनें। न्यूनतम चुना गया अधिक चाल चलने की अनुमति देगा। विशेष दिशा में जाने के लिए, यदि वक्र स्थिति x (या y)> n (या m) है तो n (या m) तक पहुँचने के लिए चालों की संख्या (n - cur स्थिति)/x है। यदि यह कम है तो 1 तक पहुँचने के लिए चालों की संख्या है (cur स्थिति - 1 )/x।

  • AXB ग्रिड को निरूपित करने के लिए चर A,B और आरंभिक बिंदु के लिए x,y लें।

  • एक वेक्टर लें जिसमें पूर्णांक जोड़े होते हैं (वेक्टर <जोड़ी> )।

  • फ़ंक्शन संभव_मूव्स (इंट एक्स, इंट वाई, इंट ए, इंट बी, वेक्टर<जोड़ी<इंट, इंट>> मूव, इंट साइज) सभी चर और चाल लेता है और ग्रिड में दी गई दिशा में संभावित चालों की गिनती देता है।

  • फ़ंक्शन संभव (int x, int temp_x, int A) निर्देशांक की वर्तमान स्थिति x के रूप में लेता है, इसी समन्वय मान को temp_x के रूप में ले जाता है और उस समन्वय के लिए ग्रिड की सीमा A के रूप में लेता है।

  • अब अगर temp_x 0 है तो वापसी मान को अधिकतम बनाने के लिए INT_MAX लौटाएं।

  • यदि temp_x> 0 है तो A तक पहुँचने के लिए चालें होंगी | ए-एक्स |/temp_x

  • वरना 1 चाल की ओर बढ़ना होगा | x-1 |/temp_x.

  • संबंधित गणना की गई चालें लौटाएं।

  • संभव_मूव्स () के अंदर, प्रारंभिक गणना 0 के रूप में लें।

  • i=0 से i<आकार तक लूप के लिए उपयोग करते हुए ट्रैवर्स वेक्टर।

  • वर्तमान जोड़ी से निर्देशांक निकालें जैसे temp_x=move[i].first और temp_y=move[i].second.

  • संभव () फ़ंक्शन का उपयोग करके न्यूनतम संभव चालों के रूप में परिवर्तनीय जांच करें।

  • चेक में न्यूनतम मूल्य कुल चरणों की गणना के लिए जोड़ा जाएगा।

  • अब जबकि हमने चेक चुना है, x और y को चेक से अपडेट करें।

  • अंत में हम एक ग्रिड में दी गई दिशा में संभावित चालों की कुल संख्या प्राप्त करेंगे

  • परिणाम के रूप में वापसी की गिनती।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int possible(int x, int temp_x, int A){
   if(temp_x == 0){
      return INT_MAX;
   }
   if (temp_x > 0){
      return abs((A - x) / temp_x);
   }
   else{
      return abs((x - 1) / temp_x);
   }
}
int possible_moves(int x, int y, int A, int B, vector<pair<int, int>> move, int size){
   int count = 0;
   for (int i = 0; i < size; i++){
      int temp_x = move[i].first;
      int temp_y = move[i].second;
      int check = min(possible(x, temp_x, A), possible(y, temp_y, B));
      count = count + check;
      x = x + check * temp_x;
      y = y + check * temp_y;
   }
   return count;
}
int main(){
   int A = 3, B = 6, x = 3, y = 3;
   vector<pair<int, int> > move = {
      { 2, -1 },
      { 0, 1 },
      { 1, -2 }
   };
   int size = move.size();
   cout<<"Count of possible moves in the given direction in a grid are: "<<possible_moves(x, y, A, B, move, size);
   return 0;
}

आउटपुट

यदि हम उपरोक्त कोड चलाते हैं तो यह निम्न आउटपुट उत्पन्न करेगा -

Count of possible moves in the given direction in a grid are: 3

  1. C++ में दिए गए मैट्रिक्स में 1s के वर्ग सबमैटिक्स की संख्या गिनने का कार्यक्रम

    मान लीजिए कि हमारे पास 2d बाइनरी मैट्रिक्स है, हमें सभी 1 s के साथ सबमैट्रिस की कुल संख्या ज्ञात करनी है। तो, अगर इनपुट पसंद है 1 1 0 1 1 0 0 0 1 तो आउटपुट 10 होगा, क्योंकि वहां पांच 1 x 1 मैट्रिक्स, दो 2 x 1 मैट्रिक्स है। दो 1 x 2 मैट्रिक्स। और एक 2 x 2 मैट्रिक्स। इसे हल करने के लिए, हम इन

  1. C++ में दिए गए स्ट्रिंग से n लंबाई के उप-स्ट्रिंग्स की संख्या संभव है

    हमें एक स्ट्रिंग str[] और एक संख्या n दी गई है। लक्ष्य str[] के सभी सबस्ट्रिंग्स को खोजना है जिनकी लंबाई n है। यदि स्ट्रिंग abcde और n=3 है तो लंबाई 3 के सबस्ट्रिंग abc, bcd, cde हैं और गिनती 3 है। आइए उदाहरणों से समझते हैं। इनपुट - str[] =कंप्यूटर n=4 आउटपुट − दी गई स्ट्रिंग से n लंबाई के सबस्ट्

  1. C++ में दिए गए आकार के आयत के अंदर संभव रंबी की संख्या की गणना करें

    हमें ऊंचाई X चौड़ाई के रूप में आयामों के साथ एक आयत दिया गया है। आयत को एक 2D निर्देशांक प्रणाली पर दर्शाया गया है जिसमें बिंदु (0,0) पर बाएँ-निचले कोने हैं। तो लक्ष्य इस आयत के अंदर संभव रोम्बी की संख्या को गिनना है ताकि ये सभी शर्तें पूरी हों - समचतुर्भुज का क्षेत्रफल 0 से अधिक होता है। समचत