কম্পিউটার

C++ এ স্বতন্ত্র দ্বীপের সংখ্যা II


ধরুন আমাদের গ্রিড নামে একটি খালি 2D বাইনারি অ্যারে আছে, এখানে একটি দ্বীপ হল 1 এর (ভূমির প্রতিনিধিত্বকারী) একটি গ্রুপ যা 4-দিকনির্দেশকভাবে সংযুক্ত। আমরা গ্রিডের চারটি প্রান্তই পানি দ্বারা বেষ্টিত বলে ধরে নিতে পারি।

আমাদের স্বতন্ত্র দ্বীপের সংখ্যা গুনতে হবে। একটি দ্বীপের আকৃতি একই থাকলে বা 90, 180, বা 270 ডিগ্রি ঘূর্ণনের পরে বা বাম/ডান দিক বা উপরে/নীচ দিক প্রতিফলনের পরে একই আকৃতি থাকলে অন্য দ্বীপটিকে একই বলে মনে করা হয়।

সুতরাং, যদি ইনপুট মত হয়,

1 1 0 0 0
1 0 0 0 0
0 0 0 0 1
0 0 0 1 1

তাহলে আউটপুট হবে 1

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি মানচিত্র m

    সংজ্ঞায়িত করুন
  • একটি ফাংশন সংজ্ঞায়িত করুন dfs(), এটি i, j, grid, idx,

    লাগবে
  • যদি i এবং j গ্রিডের পরিসরে থাকে এবং গ্রিড[i,j] 0 হয় তাহলে −

    • ফেরত

  • গ্রিড[i, j] :=0

  • m[idx]

    এর শেষে {i, j } সন্নিবেশ করুন
  • dfs(i + 1, j, grid, idx)

  • dfs(i - 1, j, গ্রিড, idx)

  • dfs(i, j - 1, grid, idx)

  • dfs(i, j + 1, grid, idx)

  • একটি ফাংশন আদর্শ সংজ্ঞায়িত করুন, এটি একটি অ্যারে v

    নেবে
    • 8টি সারি সহ জোড়ার একটি 2D অ্যারে s সংজ্ঞায়িত করুন

    • আরম্ভ করার জন্য i :=0, যখন i

      • x :=v[i]।প্রথম

      • y :=v[i].সেকেন্ড

      • s[0>

        এর শেষে { x, y } ঢোকান
      • s[1]

        এর শেষে { x, -y } সন্নিবেশ করুন
      • s[2]

        এর শেষে { - x, y } ঢোকান
      • s[3]

        এর শেষে { - x, -y } ঢোকান
      • s[4]

        এর শেষে { y, x } ঢোকান
      • s[5]

        এর শেষে { y, -x } সন্নিবেশ করুন
      • s[6]

        এর শেষে { - y, x } ঢোকান
      • s[7]

        এর শেষে { - y, -x } ঢোকান
    • আরম্ভ করার জন্য i :=0, যখন i

      • অ্যারে s[i>

        সাজান
    • আরম্ভ করার জন্য i :=0, যখন i

      • j শুরু করার জন্য :=1, যখন j

        • s[i, j].first :=s[i, j].first - s[i, 0].first

        • s[i, j].second :=s[i, j].second - s[i, 0].second

      • s[i, 0]।প্রথম :=0

      • s[i, 0].সেকেন্ড :=0

    • অ্যারে s

      সাজান
    • s[0]

      ফেরত দিন
  • প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -

  • এক সেট পয়েন্ট সংজ্ঞায়িত করুন

  • cnt :=1

  • আরম্ভ করার জন্য i :=0, যখন i <গ্রিডের আকার, আপডেট (i 1 দ্বারা বৃদ্ধি), −

    • j শুরু করার জন্য :=0, যখন j <গ্রিডের আকার[0], আপডেট করুন (j 1 দ্বারা বৃদ্ধি করুন), &miuns করুন;

      • যদি গ্রিড[i, j] 1 এর মত হয়, তাহলে −

        • (1 দ্বারা cnt বাড়ান)

        • dfs(i, j, grid, cnt)

        • আদর্শ (m[cnt]) pts এ সন্নিবেশ করান

  • পয়েন্টের রিটার্ন সাইজ

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#include  namespace ব্যবহার করে std;class Solution { public:map >> m; void dfs(int i, int j, ভেক্টর <ভেক্টর >&গ্রিড, int idx){ if (i>=grid.size() || j>=গ্রিড[0].size() || i <0 || !গ্রিড[i][j]) রিটার্ন; গ্রিড[i][j] =0; m[idx].push_back({ i, j }); dfs(i + 1, j, গ্রিড, idx); dfs(i - 1, j, grid, idx); dfs(i, j - 1, grid, idx); dfs(i, j + 1, grid, idx); } ভেক্টর <পেয়ার > আদর্শ(ভেক্টর <জোড়া > v){ ভেক্টর<ভেক্টর<জোড়া>> s(8); জন্য (int i =0; i >&গ্রিড) { সেট<ভেক্টর<পেয়ার>> pts; int cnt =1; (int i =0; i > v ={{1,1,0,0,0},{1,0,0,0,0},{0,0,0,0,1},{0,0 {0,1,1}}; cout <<(ob.numDistinctIslands2(v));}

ইনপুট

<প্রে>{1,1,0,0,0},{1,0,0,0,0},{0,0,0,0,1},{0,0,0,1,1 }}

আউটপুট

1

  1. C++ এ ডিসজয়েন্ট সেট ব্যবহার করে দ্বীপের সংখ্যা খুঁজুন

  2. C++ এ মিতব্যয়ী নম্বর

  3. C++ পেন্টাটোপ নম্বর

  4. C++ এ অ্যাডাম নম্বর