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

C++ में भूलभुलैया में गंतव्य तक पहुंचने के तरीकों की संख्या गिनें

एक भूलभुलैया को एक पंक्ति X कॉलम मैट्रिक्स के रूप में दर्शाया गया है जिसमें बाधा को -1 के रूप में दर्शाया गया है और एक स्पष्ट सेल का मान -1 के अलावा है। लक्ष्य पहली सेल एआर [0] [0] से शुरू करना है और आखिरी सेल एआर [पंक्ति] [कॉल] तक पहुंचना है, जैसे कि केवल दो चालों की अनुमति है:

  • गिरफ्तारी[i][j] को गिरफ्तार करने के लिए सही कदम[i][j+1] और
  • गिरफ्तारी [i][j] से arr[i+1][j] तक नीचे जाएं।

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

इनपुट - arr[row][col] ={{0, 0, 0}, {-1, -1, 0}, {0, 0, 0}}

आउटपुट - भूलभुलैया में गंतव्य तक पहुंचने के तरीकों की संख्या हैं:1

स्पष्टीकरण

0 1 2

0 0 0 0

1 -1 -1 0

2 0 0 0

तरीके होंगे :

  • सेल (0,0) → सेल (0,1) → सेल (0,2) → सेल (1,2) → सेल (2,0)

इनपुट - एआर [पंक्ति] [कॉल] ={{0, 0, 0, 0}, {-1, 0, -1, 0}, {-1, 0, -1, 0}, {0, 0, 0, 0}}

आउटपुट - भूलभुलैया में गंतव्य तक पहुंचने के तरीकों की संख्या हैं:2

स्पष्टीकरण

0 1 2 3

0 0 0 0 0

1 -1 0 -1 0

2 -1 0 -1 0

3 0 0 0 0

तरीके होंगे :

  • सेल (0,0) → सेल (0,1) → सेल (1,1) → सेल (2,1) → सेल (3,1) → सेल (3,2) → सेल (3,3 )
  • सेल (0,0) → सेल (0,1) → सेल (0,2) → सेल (0,3) → सेल (1,3) → सेल (2,3) → सेल (3,3 )

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

इस दृष्टिकोण में हम पहले सभी शून्य को 1 पर सेट करेंगे। भूलभुलैया मैट्रिक्स को फिर से और अब प्रत्येक सेल के लिए, यदि यह रुकावट (-1) है, तो इसे अनदेखा करें। यदि नहीं, तो ऊपरी सेल (i-1,j) और बाएं सेल (i,j-1) की जांच करें। यदि यह शून्य से अधिक है तो इसके मान को वर्तमान सेल (i, j) में जोड़ें। इस तरह हमें सेल पर योग (पंक्ति-1, कॉलम-1) तक पहुंचने के कुल तरीकों के रूप में मिलेगा।

  • इनपुट ऐरे arr[row][col] को भूलभुलैया के रूप में लें।
  • Function definition_maze(int arr[row][col]) गिरफ्तारी लेता है और भूलभुलैया में गंतव्य तक पहुंचने के तरीकों की संख्या देता है।
  • यदि पहली सेल अवरुद्ध है तो अंत तक पहुंचने के तरीके के रूप में 0 लौटाएं।
  • अब सबसे बाएं कॉलम को पार करें और सभी 0s को 1 पर सेट करें। सबसे पहले रुकावट लूप को तोड़ती है क्योंकि इसके नीचे की कोशिकाओं तक नहीं पहुंचा जा सकता है। अनुक्रमणिका i=0 से i<पंक्ति तक प्रारंभ करें और arr[i][0] को 1 पर सेट करें यदि यह 0 है।
  • इसी तरह पहली पंक्ति के लिए j=0 से j
  • गिरफ्तारी को फिर से सेल (1,1) से पार करें और अगर arr[i][j] -1 है तो कुछ न करें।
  • अगर arr[i-1][j] या arr[i][j-1] 0 से अधिक है तो arr[i][j] उनसे संपर्क किया जा सकता है। तो इसमें उनका मूल्य जोड़ें।
  • आखिर में हमारे पास उस तक पहुंचने के कुल तरीकों के रूप में arr[row-1][col-1] होगा।
  • यदि यह>0 है तो इसे वापस कर दें अन्यथा 0 लौटा दें।

उदाहरण

#include<bits/stdc++.h>

using namespace std;
#define row 3
#define col 3

int destination_maze(int arr[row][col]) {
   if (arr[0][0] == -1) {
      return 0;
   }
   for (int i = 0; i < row; i++) {
      if (arr[i][0] == 0) {
         arr[i][0] = 1;
      } else {
         break;
      }
   }
   for (int i = 1; i < col; i++) {
      if (arr[0][i] == 0) {
         arr[0][i] = 1;
      } else {
         break;
      }
   }
   for (int i = 1; i < row; i++) {
      for (int j = 1; j < col; j++) {
         if (arr[i][j] == -1) {
            continue;
         }
         if (arr[i - 1][j] > 0) {
            arr[i][j] = (arr[i][j] + arr[i - 1][j]);
         }
         if (arr[i][j - 1] > 0) {
            arr[i][j] = (arr[i][j] + arr[i][j - 1]);
         }
      }
   }
   if (arr[row - 1][col - 1] > 0) {
      return arr[row - 1][col - 1];
   } else {
      return 0;
   }
}
int main() {
   int arr[row][col] = {
      {
         0,
         0,
         0
      },
      {
         -1,
         -1,
         0
      },
      {
         0,
         0,
         0
      }
   };
   cout << "Count of number of ways to reach destination in a Maze are: " << destination_maze(arr);
   return 0;
}

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

आउटपुट

Count of number of ways to reach destination in a Maze are: 1

  1. C++ में एक सेट को k सबसेट में विभाजित करने के तरीकों की संख्या की गणना करें

    दो अंक e और p दिए गए हैं। लक्ष्य उन तरीकों की संख्या गिनना है जिनसे हम एक सेट के e तत्वों को p विभाजन/सबसेट में विभाजित कर सकते हैं। उदाहरण के लिए इनपुट e=4 p=2 आउटपुट Count of number of ways to partition a set into k subsets are: 7 स्पष्टीकरण If elements are: a b c d then ways to divide them into

  1. C++ . में 1 x m आकार की टाइलों का उपयोग करके n x ​​m आकार के फर्श को टाइल करने के तरीकों की संख्या की गणना करें

    दो नंबर n और m दिए गए हैं जो एक कमरे के फर्श की लंबाई और चौड़ाई को दर्शाते हैं। लक्ष्य उन तरीकों की संख्या गिनना है जिनमें 1Xm आकार की टाइलों का उपयोग करके इस मंजिल को टाइल किया जा सकता है। उदाहरण के लिए इनपुट n=3 m=2 आउटपुट Count the number of ways to tile the floor of size n x m using 1 x m size

  1. C++ में एक आयत में वर्गों की संख्या गिनें

    =B. लक्ष्य उन वर्गों की संख्या का पता लगाना है जिन्हें LXB आकार का एक आयत समायोजित कर सकता है। ऊपर दिया गया चित्र 3 X 2 आकार का एक आयत दिखाता है। इसमें 2, 2X2 वर्ग और 6,1X1 वर्ग हैं। कुल वर्ग=6+2=8. LXB आकार के प्रत्येक आयत में L*B संख्या 1X1 वर्ग होती है। सबसे बड़े वर्ग BXB आकार के होते ह