#include <iostream>
#include <vector>
using namespace std;
bool inRange(int i, int j, int m, int n){
return i>=0 && i<m && j>=0 && j<n ;
}
void dfs(const vector< vector<int> >& v , vector< vector<bool> >& mark, int m, int n, int i, int j){
if(!inRange(i,j,m,n) || mark[i][j])
return;
if( v[i][j]==1){
mark[i][j]=true;
dfs(v, mark, m, n, i-1, j);
dfs(v, mark, m, n, i, j-1);
dfs(v, mark, m, n, i+1, j);
dfs(v, mark, m, n, i, j+1);
}
}
int getConnectedCount(const vector< vector<int> >& v , int m, int n){
int count=0;
vector< vector<bool> > mark(m, vector<bool>(n, false));
for (int i = 0; i < m; ++i){
for(int j=0; j<n; ++j){
if(v[i][j]==1 && !mark[i][j]){
dfs(v, mark,m, n, i, j);
count++;
}
}
}
return count;
}
int main(int argc, char const *argv[])
{
vector< vector<int> > a =
{
{1,0,1},
{0,1,0},
{1,1,1}
};
vector< vector<int> > b =
{
{1,1,1},
{0,0,1},
{1,1,1}
};
vector< vector<int> > c =
{
{1,1,1,1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,1,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1}
};
cout<<getConnectedCount(a,3,3)<<endl;
cout<<getConnectedCount(b,3,3)<<endl;
cout<<getConnectedCount(c,7,12)<<endl;
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpib29sIGluUmFuZ2UoaW50IGksIGludCBqLCBpbnQgbSwgaW50IG4pewoJcmV0dXJuIGk+PTAgJiYgaTxtICYmIGo+PTAgJiYgajxuIDsKfQoKdm9pZCBkZnMoY29uc3QgdmVjdG9yPCB2ZWN0b3I8aW50PiA+JiB2ICwgdmVjdG9yPCB2ZWN0b3I8Ym9vbD4gPiYgbWFyaywgIGludCBtLCBpbnQgbiwgaW50IGksIGludCBqKXsKCWlmKCFpblJhbmdlKGksaixtLG4pIHx8IG1hcmtbaV1bal0pCgkJcmV0dXJuOwoKCWlmKCB2W2ldW2pdPT0xKXsKCQltYXJrW2ldW2pdPXRydWU7CgkJZGZzKHYsIG1hcmssIG0sIG4sIGktMSwgaik7CgkJZGZzKHYsIG1hcmssIG0sIG4sIGksIGotMSk7CgkJZGZzKHYsIG1hcmssIG0sIG4sIGkrMSwgaik7CgkJZGZzKHYsIG1hcmssIG0sIG4sIGksIGorMSk7Cgl9CQp9CgoKaW50IGdldENvbm5lY3RlZENvdW50KGNvbnN0IHZlY3RvcjwgdmVjdG9yPGludD4gPiYgdiAsIGludCBtLCBpbnQgbil7CgkKCWludCBjb3VudD0wOwoJdmVjdG9yPCB2ZWN0b3I8Ym9vbD4gPiBtYXJrKG0sIHZlY3Rvcjxib29sPihuLCBmYWxzZSkpOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpewoJCWZvcihpbnQgaj0wOyBqPG47ICsrail7CgkJCWlmKHZbaV1bal09PTEgJiYgIW1hcmtbaV1bal0pewoJCQkJZGZzKHYsIG1hcmssbSwgbiwgaSwgaik7CgkJCQljb3VudCsrOwoJCQl9CQoJCX0KCX0KCXJldHVybiBjb3VudDsKfQoKCmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pCnsKCXZlY3RvcjwgdmVjdG9yPGludD4gPiBhID0KCXsKCSAgICB7MSwwLDF9LAoJICAgIHswLDEsMH0sCgkgICAgezEsMSwxfQoJfTsKCgl2ZWN0b3I8IHZlY3RvcjxpbnQ+ID4gYiA9Cgl7CgkgICAgezEsMSwxfSwKCSAgICB7MCwwLDF9LAoJICAgIHsxLDEsMX0KCX07CgoKCXZlY3RvcjwgdmVjdG9yPGludD4gPiBjID0KCXsKCSAgICB7MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9LAoJICAgIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMX0sCgkgICAgezEsMSwxLDAsMCwwLDAsMCwwLDAsMCwxfSwKCSAgICB7MSwwLDAsMCwwLDAsMSwwLDAsMCwwLDF9LAoJICAgIHsxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMX0sCgkgICAgezEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxfSwKCQl7MSwxLDEsMSwxLDEsMSwxLDEsMSwxLDF9Cgl9OwoKCgoJY291dDw8Z2V0Q29ubmVjdGVkQ291bnQoYSwzLDMpPDxlbmRsOwoJY291dDw8Z2V0Q29ubmVjdGVkQ291bnQoYiwzLDMpPDxlbmRsOwoJY291dDw8Z2V0Q29ubmVjdGVkQ291bnQoYyw3LDEyKTw8ZW5kbDsKCXJldHVybiAwOwp9