using
System;
using
System.Collections.Generic;
class
GFG
{
static
int
MAX = 100;
static
int
start, end;
static
bool
sumEqualToK(
int
[]arr,
int
n,
int
k)
{
Dictionary<
int
,
int
> um =
new
Dictionary<
int
,
int
>();
int
sum = 0, maxLen = 0;
for
(
int
i = 0; i < n; i++)
{
sum += arr[i];
if
(sum == k)
{
maxLen = i + 1;
start = 0;
end = i;
}
if
(!um.ContainsKey(sum))
um.Add(sum, i);
if
(um.ContainsKey(sum - k))
{
if
(maxLen < (i - um[sum - k]))
{
maxLen = i - um[sum - k];
start = um[sum - k] + 1;
end = i;
}
}
}
return
(maxLen != 0);
}
static
void
sumZeroMatrix(
int
[,]mat,
int
row,
int
col,
int
k)
{
int
[]temp =
new
int
[row];
int
area;
bool
sum =
false
;
int
fup = 0, fdown = 0, fleft = 0, fright = 0;
int
maxArea =
int
.MinValue;
for
(
int
left = 0; left < col; left++)
{
temp = memset(temp, 0);
for
(
int
right = left; right < col; right++)
{
for
(
int
i = 0; i < row; i++)
temp[i] += mat[i, right];
sum = sumEqualToK(temp, row, k);
area = (end - start + 1) * (right - left + 1);
if
(sum && maxArea < area)
{
fup = start;
fdown = end;
fleft = left;
fright = right;
maxArea = area;
}
}
}
if
(fup == 0 && fdown == 0 && fleft == 0 &&
fright == 0 && mat[0, 0] != k)
{
Console.Write(
"No sub-matrix with sum "
+ k +
" exists"
);
return
;
}
Console.Write(
"(Top, Left): "
+
"("
+ fup+
", "
+ fleft
+
")"
+
"\n"
);
Console.Write(
"(Bottom, Right): "
+
"("
+ fdown+
", "
+ fright
+
")"
+
"\n"
);
for
(
int
j = fup; j <= fdown; j++)
{
for
(
int
i = fleft; i <= fright; i++)
Console.Write(mat[j, i] +
" "
);
Console.WriteLine();
}
}
static
int
[] memset(
int
[]arr,
int
val)
{
for
(
int
i = 0; i < arr.Length; i++)
arr[i] = val;
return
arr;
}
public
static
void
Main(String[] args)
{
int
[,]mat = { { 1, 7, -6, 5 },
{ -8, 6, 7, -2 },
{ 10, -15, 3, 2 },
{ -5, 2, 0, 9 } };
int
row = 4, col = 4;
int
k = 7;
sumZeroMatrix(mat, row, col, k);
}
}