algorithm
  • মডিউল ১ঃ গ্রাফের বেসিক ধারণা
    • মডিউল ১_০ঃ অ্যালগরিদম
    • মডিউল ১_১ঃ গ্রাফের বেসিক
    • মডিউল ১_২ঃ অ্যাডজাসেন্সি ম্যাট্রিক্স
    • মডিউল ১_৩ঃ অ্যাডজাসেন্সি ম্যাট্রিক্স ইমপ্লিমেন্টশন
    • মডিউল ১_৪ঃ অ্যাডজাসেন্সি লিস্ট
    • মডিউল ১_৫ঃ অ্যাডজাসেন্সি লিস্ট ইমপ্লিমেন্টশন
    • মডিউল ১_৬ঃ STL pair
    • মডিউল ১_৭ঃ Edge লিস্ট
  • মডিউল ২ঃ ব্রেডথ ফার্স্ট সার্চ
    • মডিউল ২_০ঃ ব্রেডথ ফার্স্ট সার্চ কি?
    • মডিউল ২_১ঃ বিএফএস এলগোরিদম
    • মডিউল ২_২ঃ বিএফএস কোড ইমপ্লিমেন্টেশন
    • মডিউল ২_৩ঃ বিএফএস লেভেল ট্র্যাকিং
    • মডিউল ২_৪ঃ কমপ্লেক্সিটি অ্যানালাইসিস
    • মডিউল ২_৫ঃ পাথ প্রিন্টিং
    • মডিউল ২_৬ঃ পাথ প্রিন্টিং ইমপ্লিমেন্টেশন
  • মডিউল ৩ঃ DFS এবং 2D গ্রীড
    • মডিউল ৩_০ঃ ইনট্রোডাকশন
    • মডিউল ৩_১ঃ DFS
    • মডিউল ৩_২ঃ DFS ইমপ্লিমেন্টশন
    • মডিউল ৩_৩ঃ 2D গ্রীড
    • মডিউল ৩_৪ঃ 2D গ্রীডে DFS ইমপ্লিমেন্টশন
    • মডিউল ৩_৫ঃ 2D গ্রীডে BFS ইমপ্লিমেন্টশন
  • মডিউল ৫ঃ Cycle Detection
    • মডিউল ৫_০ঃ ইনট্রোডাকশন
    • মডিউল ৫_১ঃ Cycle Detection Undirected গ্রাফে
    • মডিউল ৫_২ঃ Cycle Detection Undirected গ্রাফ BFS ইমপ্লিমেন্টশন
    • মডিউল ৫_৩ঃ Cycle Detection Undirected গ্রাফ DFS ইমপ্লিমেন্টশন
    • মডিউল ৫_৪ঃ Cycle Detection Directed গ্রাফে
    • মডিউল ৫_৫ঃ Cycle Detection Directed গ্রাফ DFS ইমপ্লিমেন্টশন
  • মডিউল ৬ঃ Dijkstra এলগরিদম
    • মডিউল ৬_০ঃ ইনট্রডাকশন
    • মডিউল ৬_১ঃ কেন Dijkstra এলগরিদম আমাদের প্রয়োজন?
    • মডিউল ৬_২ঃ পাথ রিলেক্সেশন
    • মডিউল ৬_৩ঃ Dijkstra Naive Approach
    • মডিউল ৬_৪ঃ Dijkstra Naive Approach Code
    • মডিউল ৬_৫ঃ Dijkstra Optimize Approach
    • মডিউল ৬_৭ঃ Dijkstra Optimize Code
  • মডিউল ৭ঃ Bellmanford এবং Floyd Warshall এলগোরিদম
    • মডিউল ৭_১ঃ কেন দরকার Bellmanford?
    • মডিউল ৭_২ঃ Bellmanford Algorithm
    • মডিউল ৭_৪ঃ Bellmanford Algorithm Code
    • মডিউল ৭_৫ঃ ডিটেক্ট নেগেটিভ সাইকেল
    • মডিউল ৭_৬ঃ কেন Floyd Warshall এলগোরিদম প্রয়োজন?
    • মডিউল ৭_৭ঃ Floyd Warshall Algorithm
    • মডিউল ৭_৮ঃ Floyd Warshall Algoritm Code
  • মডিউল ৯ঃ BFS , DFS দিয়ে Problem Solving
    • মডিউল ৯_০ঃ ইনট্রোডাকশন
    • মডিউল ৯_১ঃ Island Perimeter [Leetcode]
    • মডিউল ৯_২ঃ Find if Path Exists in Graph [Leetcode]
    • মডিউল ৯_৩ঃ Max Area of Island [Leetcode]
    • মডিউল ৯_৪ঃ Number of Islands [Leetcode]
    • মডিউল ৯_৫ঃ Count Sub Islands [Leetcode]
    • মডিউল ৯_৬ঃ Number of Closed Islands [Leetcode]
  • মডিউল ১০ঃ Disjoint Set Union
    • মডিউল ১০_০ঃ ইনট্রডাকশন
    • মডিউল ১০_১ঃ DSU কি?
    • মডিউল ১০_২ঃ Union Find কিভাবে কাজ করে?
    • মডিউল ১০_৩ঃ Find অপারেশন ইমপ্লিমেন্টেশন
    • মডিউল ১০_৫ঃ Union and Union by Size
    • মডিউল ১০_৭ঃ Union by rank
  • মডিউল ১১ঃ DSU Cycle Detection এবং MST
    • মডিউল ১১_০ঃ ইনট্রডাকশন
    • মডিউল ১১_১ঃ DSU দিয়ে Cycle Detection Undirected গ্রাফে
    • মডিউল ১১_২ঃ DSU দিয়ে Cycle Detection Undirected গ্রাফে ইমপ্লিমেন্টেশন
    • মডিউল ১১_৩ঃ Minimum Spanning Tree কি ?
    • মডিউল ১১_৪ঃ MST এর জন্য Kruskals Algorithm
    • মডিউল ১১_৫ঃ MST এর জন্য Kruskals Algorithm ইমপ্লিমেন্টেশন
  • মডিউল ১৩ঃ বেসিক গ্রাফ রিক্যাপ
    • মডিউল ১৩_০ঃ ইনট্রডাকশন
    • মডিউল ১৩_১ঃ এডজেসেন্সি ম্যাট্রিক্স
    • মডিউল ১৩_২ঃ এডজেসেন্সি লিস্ট ও এজ লিস্ট
    • মডিউল ১৩_৩ঃ এডজেসেন্সি লিস্ট টু এডজেসেন্সি ম্যাট্রিক্স পার্ট-১
    • মডিউল ১৩_৪ঃ এডজেসেন্সি লিস্ট টু এডজেসেন্সি ম্যাট্রিক্স পার্ট-২
    • মডিউল ১৩_৫ঃ এজ লিস্ট টু ম্যাট্রিক্স
    • মডিউল ১৩_৬ঃ এডজেসেন্সি ম্যাট্রিক্স টু এডজেসেন্সি লিস্ট
    • মডিউল ১৩_৭ঃ এজ লিস্ট টু এডজেসেন্সি লিস্ট
    • মডিউল ১৩_৮ঃ এডজেসেন্সি ম্যাট্রিক্স টু এজ লিস্ট
    • মডিউল ১৩_৯ঃ এডজেসেন্সি লিস্ট টু এজ লিস্ট
  • মডিউল ১৪ঃ প্রব্লেম সল্ভিং গ্রাফ অ্যালগরিদম দিয়ে
    • মডিউল ১৪_০ঃ ইনট্রডাকশন
    • মডিউল ১৪_১ঃ Romeo and Juliet
    • মডিউল ১৪_২ঃ Romeo and Juliet ইমপ্লিমেন্টেশন
    • মডিউল ১৪_৩ঃ Minimum Cost for Business
    • মডিউল ১৪_৪ঃ Dijkstra Path Printing
    • মডিউল ১৪_৫ঃ Building Roads
    • মডিউল ১৪_৬ঃ Building Roads ইমপ্লিমেন্টেশন
    • মডিউল ১৪_৭ঃ Message Routes
  • মডিউল ১৫ঃ প্রব্লেম সল্ভিং ২ গ্রাফ অ্যালগরিদম দিয়ে
    • মডিউল ১৫_০ঃ ইনট্রডাকশন
    • মডিউল ১৫_১ঃ Sundorban ইমপ্লিমেন্টেশন সহ
    • মডিউল ১৫_২ঃ Guilty Prince ইমপ্লিমেন্টেশন সহ
    • মডিউল ১৫_৩ঃ Commandos
    • মডিউল ১৫_৪ঃ Commandos ইমপ্লিমেন্টেশন
    • মডিউল ১৫_৫ঃ D. Roads not only in Berland
    • মডিউল ১৫_৬ঃ D. Roads not only in Berland ইমপ্লিমেন্টেশন
  • মডিউল ১৭ঃ বেসিক ডাইনামিক প্রোগামিং
    • মডিউল ১৭_০ঃ ইনট্রডাকশন
    • মডিউল ১৭_১ঃ ডাইনামিক প্রোগ্রামিং কি?
    • মডিউল ১৭_২ঃ ফ্যাক্টোরিয়াল নাম্বার
    • মডিউল ১৭_৩ঃ Fibonacci Series
    • মডিউল ১৭_৪ঃ Fibonacci Subproblem
    • মডিউল ১৭_৬ঃ Fibonacci Memoization
    • মডিউল ১৭_৭ঃ Bottom up approach in Fibonacci series
  • মডিউল ১৮ঃ Knapsack
    • মডিউল ১৮_০ঃ ইনট্রডাকশন
    • মডিউল ১৮_১ঃ Knapsack
    • মডিউল ১৮_২ঃ Knapsack Recursive Approach
    • মডিউল ১৮_৪ঃ Knapsack Top Down Approach ইমপ্লিমেন্টেশনসহ
    • মডিউল ১৮_৫ঃ Knapsack Bottom Up Approach
    • মডিউল ১৮_৬ঃ Knapsack Bottom Up ইমপ্লিমেন্টেশন
  • মডিউল ১৯ঃ 0-1 Knapsack Variation
    • মডিউল ১৯_০ঃ ইনট্রডাকশন
    • মডিউল ১৯_১ঃ সাবসেট সাম টপ ডাউন
    • মডিউল ১৯_২ঃ সাবসেট সাম Bottom up
    • মডিউল ১৯_৩ঃ Count of Subset Sum
    • মডিউল ১৯_৪ঃ Count no of Zeroes in Subset
    • মডিউল ১৯_৫ঃ Equal Sum Partition
    • মডিউল ১৯_৬ঃ Minimum Subset Sum
    • মডিউল ১৯_৭ঃ Count Subset Sum with given difference
    • মডিউল ১৯_৮ঃ Target Sum
  • বোনাস মডিউল ২১ঃ Unbounded Knapsack
    • মডিউল ২১_১ঃ Unbounded Knapsack Approach
    • মডিউল ২১_২ঃ Unbounded Knapsack ইমপ্লিমেন্টেশন
    • মডিউল ২১_৩ঃ Rod Cutting Problem
    • মডিউল ২১_৪ঃ Coin Change 1
    • মডিউল ২১_৫ঃ Coin Change 2
  • বোনাস মডিউল ২২ঃ Longest Common Subsequence
    • মডিউল ২২_১ঃ Substring vs Subsequence
    • মডিউল ২২_২ঃ Longest Common Subsequence Approach
    • মডিউল ২২_৩ঃ LCS Top Down Implementation
    • মডিউল ২২_৪ঃ LCS Bottom Up Implementation
    • মডিউল ২২_৫ঃ LCS Table Fill Up
    • মডিউল ২২_৬ঃ Printing LCS Approach
    • মডিউল ২২_৭ঃ Printing LCS Implementation
    • মডিউল ২২_৮ঃ Longest Common Substring Bottom Up and Printing
  • বোনাস মডিউল ২৩ঃ Merge Sort
    • মডিউল ২৩_০ঃ ইনট্রডাকশন
    • মডিউল ২৩_১ঃ Merge Two Sorted Arrays
    • মডিউল ২৩_২ঃ Merge two sorted array implementation
    • মডিউল ২৩_৩ঃ How Divide Works in Merge Sort
    • মডিউল ২৩_৪ঃ Merge Sort
  • মডিউল ২ঃ ব্রেডথ ফার্স্ট সার্চ
    • Untitled
    • Page 2
Powered by GitBook
On this page
  • সমাধান
  • সম্পূর্ণ কোড
  1. মডিউল ৯ঃ BFS , DFS দিয়ে Problem Solving

মডিউল ৯_৬ঃ Number of Closed Islands [Leetcode]

Previousমডিউল ৯_৫ঃ Count Sub Islands [Leetcode]Nextমডিউল ১০ঃ Disjoint Set Union

Last updated 1 year ago

একটি 2D গ্রিড 0 (ভূমি) এবং 1 (জল) নিয়ে গঠিত। একটি বদ্ধ দ্বীপ হল যা ভূমি (0) দিয়ে গঠিত এবং দ্বীপের মধ্যে জল(1) থাকতে পারে , যেইটি সম্পূর্ণভাবে (সমস্ত বাম, উপরে, ডান, নীচে) 1s দ্বারা বেষ্টিত।

বদ্ধ দ্বীপের সংখ্যা আপনার থেকে বের করতে হবে।

উপরের চিত্রে ২ টি বদ্ধ দ্বীপ পাওয়া গেছে, বদ্ধ দ্বীপকে হলুদ কালার দিয়ে চিন্থিত করা হয়েছে।

সমাধান

memset(vis, false, sizeof(vis));
n = grid.size();
m = grid[0].size();
int ans = 0;

vis array তে false assign করেছি। ans = 0 নিয়েছি, n এ grid এর number of row এবং m এ grid এর number of col রেখেছি।

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < m; j++)
    {
        if (!vis[i][j] && grid[i][j] == 0)
        {
            flag = true;
            dfs(i, j, grid);
            if (flag == true)
            {
                ans++;
            }
        }
    }
}

এখন nested লুপ চালিয়েছি, সেই grid আনভিজিটেড কিনা এবং grid ==1 কিনা চেক করে

flag variable কে refresh করেছি,

dfs কে কল করেছি এবং ans++ করেছি। dfs function complete হওয়ার পর flag==true হলে Closed Islands count করেছি।

void dfs(int si, int sj, vector<vector<int>> &grid)
{
    vis[si][sj] = true;
    if (si == 0 || si == n - 1 || sj == 0 || sj == m - 1)
        flag = false;
    for (int i = 0; i < 4; i++)
    {
        int ci = si + d[i].first;
        int cj = sj + d[i].second;
        if (valid(ci, cj) && !vis[ci][cj] && grid[ci][cj] == 0)
        {
            dfs(ci, cj, grid);
        }
    }
}

dfs function এ প্রথমে si এবং sj কে ভিজিটেড করেছি, এরপর

si , sj outer সাইডে চলে গেলে flag = false করেছি।

এরপর grid এর উপরে , নিচে , ডানে , বামে যাওয়ার জন্য লুপ চালিয়েছি। যদি ci, cj ভ্যালিড এবং আনভিজিটেড এবং grid[ci][cj]==0 হয় তাহলে ci,cj কে দিয়ে dfs function কে recursive কল করবো।

সম্পূর্ণ কোড

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

class Solution
{
public:
    int n, m;
    bool vis[105][105];
    vector<pair<int, int>> d = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
    bool valid(int ci, int cj)
    {
        if (ci >= 0 && ci < n && cj >= 0 && cj < m)
            return true;
        else
            return false;
    }
    bool flag;
    void dfs(int si, int sj, vector<vector<int>> &grid)
    {
        vis[si][sj] = true;
        if (si == 0 || si == n - 1 || sj == 0 || sj == m - 1)
            flag = false;
        for (int i = 0; i < 4; i++)
        {
            int ci = si + d[i].first;
            int cj = sj + d[i].second;
            if (valid(ci, cj) && !vis[ci][cj] && grid[ci][cj] == 0)
            {
                dfs(ci, cj, grid);
            }
        }
    }
    int closedIsland(vector<vector<int>> &grid)
    {
        memset(vis, false, sizeof(vis));
        n = grid.size();
        m = grid[0].size();
        int ans = 0;
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (!vis[i][j] && grid[i][j] == 0)
                {
                    flag = true;
                    dfs(i, j, grid);
                    if (flag == true)
                    {
                        ans++;
                    }
                }
            }
        }
        return ans;
    }
};