class Solution {
public:
    bool check(int x,int y,vector<vector<char> >& grid,vector<vector<bool>>&f)
    {
        return x>=0&&x<grid.size()&&y>=0&&y<grid[0].size()&&grid[x][y]=='1'&&!f[x][y];
    }
    void bfs(int x,int y,int &res,vector<vector<char>>&grid,vector<vector<bool>>&f)
    {
        vector<vector<int>>dir{{1,0},{-1,0},{0,1},{0,-1}};
        queue<pair<int,int>>p;
        p.push({x,y});
        while(!p.empty())
        {
            pair<int,int>k=p.front();
            f[k.first][k.second]=true;
            p.pop();
            for(auto m:dir)
            {
                int xx=m[0]+k.first,yy=m[1]+k.second;
                if(check(xx,yy,grid,f))p.push({xx,yy});
            }
        }
        res++;
    }
    int solve(vector<vector<char> >& grid) {
        int res=0;
        vector<vector<bool>> f(grid.size()+10,vector<bool>(grid[0].size()+10,false));
        for(int i=0;i<grid.size();i++)
            for(int j=0;j<grid[0].size();j++)
                if(check(i,j,grid,f))bfs(i,j,res,grid,f);
        return res;
    }
};