কম্পিউটার

একটি গ্রিডে এক প্রান্ত থেকে অন্য প্রান্তে যাওয়ার জন্য প্রয়োজনীয় পরিবর্তনগুলির সংখ্যা খুঁজে বের করতে C++ প্রোগ্রাম


ধরুন, আমাদেরকে x * y মাত্রার একটি গ্রিড দেওয়া হয়েছে যেটিতে ব্লক করা এবং আনব্লক করা দুই ধরনের সেল রয়েছে। অবরুদ্ধ কক্ষের অর্থ হল কোষগুলি অ্যাক্সেসযোগ্য নয় এবং অবরোধ মুক্ত করার অর্থ হল কোষগুলি অ্যাক্সেসযোগ্য৷ আমরা একটি 2D অ্যারেতে গ্রিডকে উপস্থাপন করি যেখানে ব্লক করা সেলগুলি '#' হিসাবে দেওয়া হয় এবং আনব্লক করা সেলগুলি '.' হিসাবে দেওয়া হয়। এখন, আমাদের সেল (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++ প্রোগ্রাম

  2. একটি গ্রিডের ভিতরে একটি বহুভুজ রয়েছে এমন বাহুর সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম

  3. একটি পাথ তৈরি করতে একটি গ্রিডে ব্লক করার জন্য সেলের সংখ্যা খুঁজে বের করার জন্য C++ প্রোগ্রাম

  4. C++ এ প্রতিপক্ষকে ধরার জন্য প্রয়োজনীয় ন্যূনতম সংখ্যক ধাপ খুঁজে বের করার প্রোগ্রাম