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

ग्रिड में एक छोर से दूसरे छोर तक जाने के लिए आवश्यक परिवर्तनों की संख्या का पता लगाने के लिए C++ प्रोग्राम

मान लीजिए, हमें x * y आयामों का एक ग्रिड दिया गया है जिसमें दो प्रकार के सेल हैं, ब्लॉक और अनब्लॉक। अवरुद्ध कोशिकाओं का अर्थ है कि कोशिकाएँ पहुँच योग्य नहीं हैं और अवरोधरहित का अर्थ है कि कोशिकाएँ पहुँच योग्य हैं। हम 2डी सरणी में ग्रिड का प्रतिनिधित्व करते हैं जहां अवरुद्ध कोशिकाओं को '#' के रूप में दिया जाता है और अनब्लॉक कोशिकाओं को '।' के रूप में दिया जाता है। अब, हमें सेल (0, 0) से सेल (x, y) तक पहुंचना है। हम केवल दो चालें कर सकते हैं, हम या तो सेल के दाईं ओर जा सकते हैं या सेल से नीचे जा सकते हैं। हमें यह ध्यान रखना होगा कि, हम केवल अनब्लॉक सेल में जा सकते हैं, और (0, 0) और (x, y) दोनों अनब्लॉक सेल हैं। यदि हम (0, 0) से (x, y) तक नहीं पहुँच सकते हैं, तो हम एक अवरुद्ध सेल को एक अनब्लॉक सेल बना सकते हैं। हमें स्रोत से अपने गंतव्य तक पहुंचने के लिए प्रदर्शन करने के लिए न्यूनतम संख्या में परिवर्तन करना होगा।

इसलिए, यदि इनपुट x =4, y =4, ग्रिड ={"..#", "#.#.", "#.##", "###."} जैसा है, तो आउटपुट 1 होगा।

केवल एक परिवर्तन ऑपरेशन किया जाना है। अगर हम सेल (2, 2) को ब्लॉक से अनब्लॉक में बदलते हैं, तो हम (0, 0) से (3, 3) तक पहुंच सकते हैं।

कदम

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

Define one 2D array mat
if grid[0, 0] is same as '#', then:
   mat[0, 0] := 1
Otherwise
   mat[0, 0] := 0
   for initialize i := 0, when i < x, update (increase i by 1), do:
      for initialize j := 0, when j < y, update (increase j by 1), do:
         if i + 1 < x, then:
            mat[i + 1, j] = minimum of (mat[i + 1, j], mat[i, j] + (1 if grid[i + 1, j] is same as '#' AND grid[i, j] is same as '.'))
   if j + 1 < y, then:
mat[i, j + 1] = minimum of (mat[i, j + 1], mat[i, j]+(1 if grid[i, j + 1] is same as '#' AND grid[i, j] is same as '.'))
return mat[x - 1, y - 1]

उदाहरण

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h>
using namespace std;

int solve(int x, int y, vector<string> grid){
   vector<vector<int>> mat(x, vector<int>(y, 100));
   if(grid[0][0] == '#')
      mat[0][0] = 1;
   else
      mat[0][0] = 0;
   for(int i = 0; i < x; i++){
      for(int j = 0; j < y; j++){
         if(i + 1 < x){
            mat[i + 1][j] = min(mat[i + 1][j], mat[i][j] + (grid[i + 1][j] == '#' && grid[i][j] == '.'));
         }
         if(j + 1 < y){
            mat[i][j + 1] = min(mat[i][j + 1],mat[i][j]+(grid[i][j + 1] == '#' && grid[i][j] == '.'));
         }
      }
   }
   return mat[x - 1][y - 1];
}
int main() {
   int x = 4, y = 4;
   vector<string> grid = {"..#.", "#.#.", "#.##", "###."};
   cout<< solve(x, y, grid);
   return 0;
}

इनपुट

4, 4, {"..#.", "#.#.", "#.##", "###."}

आउटपुट

1

  1. C++ प्रोग्राम एक ग्रिड में प्रबुद्ध कोशिकाओं की संख्या का पता लगाने के लिए

    मान लीजिए, हमें h * w आयामों का एक ग्रिड दिया गया है। ग्रिड में कोशिकाओं में या तो बल्ब या बाधाएं हो सकती हैं। एक लाइट बल्ब सेल स्वयं को और उसके दाएं, बाएं, ऊपर और नीचे की कोशिकाओं को रोशन करता है और प्रकाश कोशिकाओं के माध्यम से चमक सकता है जब तक कि कोई बाधा सेल प्रकाश को अवरुद्ध न करे। एक बाधा सेल

  1. पथ बनाने के लिए ग्रिड में ब्लॉक करने के लिए कोशिकाओं की संख्या का पता लगाने के लिए सी ++ प्रोग्राम

    मान लीजिए, h * w आयामों का एक ग्रिड है। सेल स्थिति (0, 0) में एक रोबोट है और उसे स्थिति (h-1, w-1) पर जाना है। एक ग्रिड में दो प्रकार के सेल होते हैं, ब्लॉक और अनब्लॉक। रोबोट अनब्लॉक की गई कोशिकाओं से गुजर सकता है लेकिन अवरुद्ध कोशिकाओं से नहीं गुजर सकता। रोबोट चार दिशाओं में जा सकता है; यह बाएँ, दा

  1. सी ++ में प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम चरणों को खोजने का कार्यक्रम

    मान लीजिए कि हमारे पास [u, v] के रूप में पेड़ के किनारों की एक सूची है, यह इंगित करता है कि u और v के बीच एक अप्रत्यक्ष किनारा है। और हमारे पास दो मान x और y भी हैं। यदि हम नोड x पर हैं, और हमारा प्रतिद्वंद्वी नोड y पर है। पहले दौर में, हम आगे बढ़ते हैं, फिर अगले दौर में प्रतिद्वंद्वी चलता है और इसी