dfs:
#include <iostream>
using namespace std;
short d[4][2] = {1,0,0,1,-1,0,0,-1};
char g[110][110];
int n, m, ans;
void dfs(int i, int j)
{
g[i][j] = '.';
for (int k=0;k<4;++k)
{
int x = i + d[k][0];
int y = j + d[k][1];
if (0<=x && x<n && 0<=y && y<m && g[x][y]=='#')
dfs(x, y);
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d %d\n", &n, &m);
for (int i=0;i<n;++i)
{
for (int j=0;j<m;++j)
scanf("%c", &g[i][j]);
getchar();
}
ans = 0;
for (int i=0;i<n;++i)
for (int j=0;j<m;++j)
if (g[i][j]=='#')
{
ans++;
dfs(i, j);
}
printf("%d\n", ans);
}
return 0;
}
bfs:
#include <iostream>
#include <queue>
using namespace std;
short d[4][2] = {1,0,0,1,-1,0,0,-1};
struct N
{
int x, y;
}o;
char g[110][110];
int n, m, ans;
queue <N> Q;
void bfs(int i, int j)
{
N v = {i, j};
Q.push(v);
while (!Q.empty())
{
o = Q.front(), Q.pop();
g[i = o.x][j = o.y] = '.';
for (int k=0;k<4;++k)
{
int x = i + d[k][0];
int y = j + d[k][1];
if (0<=x && x<n && 0<=y && y<m && g[x][y]=='#')
{
g[x][y] = '.';
N v = {x, y};
Q.push(v);
}
}
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d %d\n", &n, &m);
for (int i=0;i<n;++i)
{
for (int j=0;j<m;++j)
scanf("%c", &g[i][j]);
getchar();
}
ans = 0;
for (int i=0;i<n;++i)
for (int j=0;j<m;++j)
if (g[i][j]=='#')
{
ans++;
bfs(i, j);
}
printf("%d\n", ans);
}
return 0;
}
union find sets:
#include <iostream>
#define v(i,j,m) (i-1)*m+j
using namespace std;
short d[4][2] = {1,0,0,1,-1,0,0,-1};
char g[110][110];
int n, m, ans, f[10010];
int find(int x)
{
if (f[x]!=x) f[x] = find(f[x]);
return f[x];
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
scanf("%d %d\n", &n, &m);
ans = 0;
for (int i=1;i<=n;++i)
{
for (int j=1;j<=m;++j)
{
scanf("%c", &g[i][j]);
if (g[i][j]=='#') ans++;
f[v(i,j,m)] = v(i,j,m);
}
getchar();
}
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
if (g[i][j]=='#')
{
if (g[i-1][j]=='#' && g[i][j-1]=='#')
{
int a = find(v(i-1,j,m));
int b = find(v(i,j-1,m));
if (a!=b) f[b] = a, ans--;
f[v(i,j,m)] = a, ans--;
}
else if (g[i-1][j]=='#')
{
f[v(i,j,m)] = find(v(i-1,j,m));
ans--;
}
else if (g[i][j-1]=='#')
{
f[v(i,j,m)] = find(v(i,j-1,m));
ans--;
}
}
printf("%d\n", ans);
}
return 0;
}