.NET 4.x Поиск наибольшего острова - C#
Формулировка задачи:
Собственно есть массив X x Y где X>=0 и X<10000; Y>=0 и Y<10000
Массив это байты, надо посчитать максимальный размер острова.
Да массив это ЧБ картинка (если точнее градации, к которому был применён порог)
Написал вот такой код.
И C# говорит мне System.StackOverflowException
Как можно поправить? На маленьких примерах такой код работает...
private Int32 GetMaxSize(byte[,] matrix)
{
var matrix1 = (byte[,])matrix.Clone();
Int32 mSize = 0;
for (var i = 0; i < matrix1.GetLength(0); i++)
for (var j = 0; j < matrix1.GetLength(1); j++)
{
var len = 0;
var size = GetSizeInt(matrix1, i, j, ref len);
if (size > mSize)
{
mSize = size;
//GetBitmapFromGsArray(matrix1).Save($"{i}_{j}.png", ImageFormat.Png); // дебаг
}
}
return mSize;
}
private Int32 GetSizeInt(byte[,] matrix, Int32 i, Int32 j, ref Int32 lenght)
{
if ((i < 0) || (i >= matrix.GetLength(0))) return lenght;
if ((j < 0) || (j >= matrix.GetLength(1))) return lenght;
if (matrix[i, j] > 128)
{
lenght++;
matrix[i, j] = 0;
GetSizeInt(matrix, i, j + 1, ref lenght);
GetSizeInt(matrix, i, j - 1, ref lenght);
GetSizeInt(matrix, i + 1, j, ref lenght);
GetSizeInt(matrix, i - 1, j, ref lenght);
}
return lenght;
}Решение задачи: «.NET 4.x Поиск наибольшего острова»
textual
Листинг программы
using System;
using System.Collections.Generic;
namespace FirtsApp
{
class Program
{
static bool isValidPoint(int i, int j, byte[,] map)
{
return ((i >= 0) && (i < map.GetLength(0)) &&
(j >= 0) && (j < map.GetLength(1)) &&
map[i, j] > 128);
}
static int GetMaxSize(byte[,] map)
{
byte[,] mapCopy = (byte[,])map.Clone();
int maxSize = 0, tmpSize;
Tuple<int, int>[] delta = {new Tuple<int, int>(-1, 0),
new Tuple<int, int>(0, 1),
new Tuple<int, int>(1, 0),
new Tuple<int, int>(0, -1)};
Stack<Tuple<int, int>> points = new Stack<Tuple<int, int>>();
int cordX, cordY;
for (int i = 0; i < mapCopy.GetLength(0); ++i)
for (int j = 0; j < mapCopy.GetLength(1); ++j)
{
tmpSize = 0;
if (mapCopy[i,j]>128)
{
points.Clear();
Tuple<int, int> curPoint = new Tuple<int, int>(i, j);
points.Push(curPoint);
mapCopy[i, j] = 0;
++tmpSize;
while (points.Count > 0)
{
curPoint = points.Pop();
foreach (var d in delta)
{
cordX = curPoint.Item2 + d.Item2;
cordY = curPoint.Item1 + d.Item1;
if (isValidPoint(cordY, cordX, mapCopy))
{
++tmpSize;
mapCopy[cordY, cordX] = 0;
points.Push(new Tuple<int, int>(cordY, cordX));
}
}
}
}
if (tmpSize > maxSize)
maxSize = tmpSize;
}
return maxSize;
}
static void Main()
{
byte[,] map = { { 255, 0 }, { 255, 255 } };
Console.WriteLine(GetMaxSize(map));
}
}
}