.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)); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д