using
System;
using
System.Collections.Generic;
public
class
GFG {
public
class
Node {
public
int
rowNo;
public
int
edgesTravelled;
public
Node(
int
r,
int
e)
{
this
.rowNo = r;
this
.edgesTravelled = e;
}
}
public
static
int
[] GetRow(
int
[,] matrix,
int
row)
{
var
rowLength = matrix.GetLength(1);
var
rowVector =
new
int
[rowLength];
for
(
var
i = 0; i < rowLength; i++)
rowVector[i] = matrix[row, i];
return
rowVector;
}
static
void
minRowsBetweenXY(
int
[,] arr,
int
X,
int
Y)
{
int
N = arr.GetLength(0);
if
(X == Y) {
Console.WriteLine(0);
return
;
}
List<List<
int
> > graph
=
new
List<List<
int
> >();
for
(
int
i = 0; i < N; i++) {
graph.Add(
new
List<
int
>());
}
for
(
int
i = 0; i < N; i++) {
for
(
int
j = i + 1; j < N; j++) {
int
[] t1 = GetRow(arr,i);
int
[] t2 = GetRow(arr,j);
if
(shareCommon(t1,t2)) {
graph[i].Add(j);
graph[j].Add(i);
}
}
}
List<Node> q =
new
List<Node>();
bool
[] visited =
new
bool
[N];
HashSet<
int
> targetRows =
new
HashSet<
int
>();
for
(
int
i = 0; i < N; i++) {
for
(
int
j = 0; j < arr.GetLength(1); j++) {
if
(arr[i,j] == Y) {
targetRows.Add(i);
}
if
(arr[i,j] == X && !visited[i]) {
q.Add(
new
Node(i, 0));
visited[i] =
true
;
}
}
}
while
(q.Count > 0) {
Node rm = q[0];
q.RemoveAt(0);
if
(targetRows.Contains(rm.rowNo)) {
if
(rm.edgesTravelled == 0) {
Console.WriteLine(0);
return
;
}
Console.WriteLine(
rm.edgesTravelled - 1);
return
;
}
foreach
(
int
nbr
in
graph[rm.rowNo]) {
if
(!visited[nbr]) {
int
edgesTravelledBeforeNbr
= rm.edgesTravelled;
q.Add(
new
Node(
nbr,
edgesTravelledBeforeNbr + 1));
visited[nbr] =
true
;
}
}
}
Console.WriteLine(-1);
}
static
bool
shareCommon(
int
[] i,
int
[] j)
{
HashSet<
int
> row1 =
new
HashSet<
int
>();
if
(i.Length > j.Length) {
for
(
int
idx = 0; idx < i.Length; idx++) {
row1.Add(i[idx]);
}
for
(
int
idx = 0; idx < j.Length; idx++) {
if
(row1.Contains(j[idx]))
return
true
;
}
}
else
{
for
(
int
idx = 0; idx < j.Length; idx++) {
row1.Add(j[idx]);
}
for
(
int
idx = 0; idx < i.Length; idx++) {
if
(row1.Contains(i[idx]))
return
true
;
}
}
return
false
;
}
public
static
void
Main(String[] args)
{
int
[,] arr = { { 1, 2, 3, 21 },
{ 1, 11, 12, 25 },
{ 12, 13, 14, 7 },
{ 3, 5, 6, 7 },
{ 6, 8, 9, 10 } };
int
X = 1;
int
Y = 9;
minRowsBetweenXY(arr, X, Y);
}
}