using
System;
using
System.Collections.Generic;
class
Program {
const
int
MAX = 100;
static
bool
SumZero(
int
[] temp,
out
int
starti,
out
int
endj,
int
n)
{
var
presum =
new
Dictionary<
int
,
int
>();
int
sum = 0;
int
max_length = 0;
starti = -1;
endj = -1;
for
(
int
i = 0; i < n; i++) {
sum += temp[i];
if
(temp[i] == 0 && max_length == 0) {
starti = i;
endj = i;
max_length = 1;
}
if
(sum == 0) {
if
(max_length < i + 1) {
starti = 0;
endj = i;
}
max_length = i + 1;
}
if
(presum.TryGetValue(sum,
out
int
j)) {
int
old = max_length;
max_length = Math.Max(max_length, i - j);
if
(old < max_length) {
endj = i;
starti = presum[sum] + 1;
}
}
else
{
presum[sum] = i;
}
}
return
(max_length != 0);
}
static
void
SumZeroMatrix(
int
[, ] a,
int
row,
int
col)
{
int
[] temp =
new
int
[row];
int
fup = 0, fdown = 0, fleft = 0, fright = 0;
int
sum;
int
up, down;
int
maxl =
int
.MinValue;
for
(
int
left = 0; left < col; left++) {
Array.Clear(temp, 0, temp.Length);
for
(
int
right = left; right < col; right++) {
for
(
int
i = 0; i < row; i++) {
temp[i] += a[i, right];
}
bool
sumZero
= SumZero(temp,
out
up,
out
down, row);
int
ele
= (down - up + 1) * (right - left + 1);
if
(sumZero && ele > maxl) {
fup = up;
fdown = down;
fleft = left;
fright = right;
maxl = ele;
}
}
}
if
(fup == 0 && fdown == 0 && fleft == 0
&& fright == 0 && a[0, 0] != 0) {
Console.WriteLine(
"No zero-sum sub-matrix exists"
);
return
;
}
for
(
int
j = fup; j <= fdown; j++) {
for
(
int
i = fleft; i <= fright; i++) {
Console.Write(a[j, i] +
" "
);
}
Console.WriteLine();
}
}
static
void
Main()
{
int
[, ] a = { { 9, 7, 16, 5 },
{ 1, -6, -7, 3 },
{ 1, 8, 7, 9 },
{ 7, -2, 0, 10 } };
int
row = 4, col = 4;
SumZeroMatrix(a, row, col);
}
}