class
GFG
{
static
final
int
maxRow =
500
;
static
final
int
maxCol =
500
;
static
boolean
visited[][] =
new
boolean
[maxRow][maxCol];
static
boolean
isSafe(String M[],
int
row,
int
col,
char
c,
int
n,
int
l)
{
return
(row >=
0
&& row < n) &&
(col >=
0
&& col < l) &&
(M[row].charAt(col) == c &&
!visited[row][col]);
}
static
void
DFS(String M[],
int
row,
int
col,
char
c,
int
n,
int
l)
{
int
rowNbr[] = {-
1
,
1
,
0
,
0
};
int
colNbr[] = {
0
,
0
,
1
, -
1
};
visited[row][col] =
true
;
for
(
int
k =
0
; k <
4
; ++k)
{
if
(isSafe(M, row + rowNbr[k],
col + colNbr[k], c, n, l))
{
DFS(M, row + rowNbr[k],
col + colNbr[k], c, n, l);
}
}
}
static
int
connectedComponents(String M[],
int
n)
{
int
connectedComp =
0
;
int
l = M[
0
].length();
for
(
int
i =
0
; i < n; i++)
{
for
(
int
j =
0
; j < l; j++)
{
if
(!visited[i][j])
{
char
c = M[i].charAt(j);
DFS(M, i, j, c, n, l);
connectedComp++;
}
}
}
return
connectedComp;
}
public
static
void
main(String[] args)
{
String M[] = {
"aabba"
,
"aabba"
,
"aaaca"
};
int
n = M.length;
System.out.println(connectedComponents(M, n));
}
}