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